Kind Realm (renderable)
Name pool
Namespace gnoswap
Exported functions 90
Module gno.land/r/gnoswap/pool
gno 0.9 store.gno gno
⧉
1 package pool 2 3 import ( 4 "errors" 5 6 "gno.land/p/gnoswap/store/v1" 7 bptree "gno.land/p/nt/bptree/v0" 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.
ufmt "gno.land/p/nt/ufmt/v0"
9 )
10
11 // StoreKey defines the keys used for storing pool data in the KV store.
12 // These keys are prefixed with the domain address to ensure namespace isolation.
13 type StoreKey string
14
15 // Returns:
16 // - keyText: the textual store key represented by s.
17 func (s StoreKey) String() string {
18 return string (s)
19 }
20
21 const (
22 // Pool data storage keys
23 StoreKeyPools StoreKey = "pools" // Map containing all pools
24 StoreKeyObservations StoreKey = "observations" // poolPath -> observation B+tree
25 StoreKeyFeeAmountTickSpacing StoreKey = "feeAmountTickSpacing" // Fee tier to tick spacing mapping
26 StoreKeySlot0FeeProtocol StoreKey = "slot0FeeProtocol" // Protocol fee denominator(s)
27
28 // Protocol fee storage keys
29 StoreKeyPoolCreationFee StoreKey = "poolCreationFee" // Pool creation fee amount
30 StoreKeyPendingProtocolFees StoreKey = "pendingProtocolFees" // tokenPath -> amount held locally for protocol_fee
31 StoreKeyWithdrawalFeeBPS StoreKey = "withdrawalFeeBPS" // Withdrawal fee in basis points
32 StoreKeyUnlocked StoreKey = "unlocked" // Global pool reentrancy lock
33
34 // Swap hook storage keys
35 StoreKeySwapStartHook StoreKey = "swapStartHook" // Swap start hook function
36 StoreKeySwapEndHook StoreKey = "swapEndHook" // Swap end hook function
37 StoreKeyTickCrossHook StoreKey = "tickCrossHook" // Tick cross hook function
38 )
39
40 // poolStore implements the IPoolStore interface for pool domain storage.
41 // It provides type-safe access to pool data stored in the underlying KV store.
42 type poolStore struct {
43 kvStore store.KVStore
44 }
45
46 // Returns:
47 // - exists: true when the pool collection key is present in the KV store.
48 func (s *poolStore) HasPools() bool {
49 return s.kvStore.Has(StoreKeyPools.String())
50 }
51
52 // GetPools retrieves the map containing all pool data.
53 // This is the main data structure that stores all pool instances.
54 // Returns:
55 // - pools: the B+tree containing all persisted pool instances; panics if the
56 // KV store cannot read it or the stored value is nil.
57 func (s *poolStore) GetPools() *bptree.BPTree {
58 pools, err := s.kvStore.GetBPTree(StoreKeyPools.String())
59 if err != nil {
60 panic(err)
61 }
62
63 if pools == nil {
64 panic( "pools is nil" )
65 }
66
67 return pools
68 }
69
70 // SetPools stores the map containing all pool data.
71 // Parameters:
72 // - _: leading realm-call discriminator; callers pass 0.
73 // - rlm: propagated realm context; it must be the current realm or the method
74 // returns ErrSpoofedRealm before writing.
75 // - pools: non-nil B+tree containing the pool instances to persist.
76 //
77 // Returns:
78 // - err: nil when the pool tree is stored; ErrSpoofedRealm for a non-current
79 // realm, or the underlying KV-store write error.
80 func (s *poolStore) SetPools(_ int , rlm realm, pools *bptree.BPTree) error {
81 if !rlm.IsCurrent() {
82 return errors.New(ErrSpoofedRealm)
83 }
84
85 if pools == nil {
86 panic( "pools is nil" )
87 }
88
89 return s.kvStore.Set( 0 , rlm, StoreKeyPools.String(), pools)
90 }
91
92 // Returns:
93 // - exists: true when the observations collection key is present in the KV store.
94 func (s *poolStore) HasObservations() bool {
95 return s.kvStore.Has(StoreKeyObservations.String())
96 }
97
98 // Returns:
99 // - observations: the B+tree containing persisted observation trees; panics if
100 // the KV store cannot read it or the stored value is nil.
101 func (s *poolStore) GetObservations() *bptree.BPTree {
102 observations, err := s.kvStore.GetBPTree(StoreKeyObservations.String())
103 if err != nil {
104 panic(err)
105 }
106 if observations == nil {
107 panic( "observations is nil" )
108 }
109 return observations
110 }
111
112 // Parameters:
113 // - _: leading realm-call discriminator; callers pass 0.
114 // - rlm: propagated realm context; it must be the current realm or the method
115 // returns ErrSpoofedRealm before writing.
116 // - observations: non-nil B+tree containing the observation data to persist.
117 //
118 // Returns:
119 // - err: nil when the observation tree is stored; ErrSpoofedRealm for a
120 // non-current realm, or the underlying KV-store write error.
121 func (s *poolStore) SetObservations(_ int , rlm realm, observations *bptree.BPTree) error {
122 if !rlm.IsCurrent() {
123 return errors.New(ErrSpoofedRealm)
124 }
125 if observations == nil {
126 panic( "observations is nil" )
127 }
128 return s.kvStore.Set( 0 , rlm, StoreKeyObservations.String(), observations)
129 }
130
131 // Returns:
132 // - exists: true when the fee-tier/tick-spacing mapping key is present in the
133 // KV store.
134 func (s *poolStore) HasFeeAmountTickSpacing() bool {
135 return s.kvStore.Has(StoreKeyFeeAmountTickSpacing.String())
136 }
137
138 // GetFeeAmountTickSpacing retrieves the mapping between fee amounts and tick spacing.
139 // This mapping determines the tick spacing for each supported fee tier.
140 // Returns:
141 // - feeAmountTickSpacing: a copy of the fee amount to tick-spacing mapping;
142 // panics if the KV value cannot be read, has the wrong type, or is nil.
143 func (s *poolStore) GetFeeAmountTickSpacing() map [ uint32 ] int32 {
144 result, err := s.kvStore.Get(StoreKeyFeeAmountTickSpacing.String())
145 if err != nil {
146 panic(err)
147 }
148
149 feeAmountTickSpacing, ok := result.( map [ uint32 ] int32 )
150 if !ok {
151 panic(ufmt.Sprintf( "failed to cast result to map[uint32]int32: %T" , result))
152 }
153
154 if feeAmountTickSpacing == nil {
155 panic( "feeAmountTickSpacing is nil" )
156 }
157
158 return cloneFeeAmountTickSpacings(feeAmountTickSpacing)
159 }
160
161 // SetFeeAmountTickSpacing stores the mapping between fee amounts and tick spacing.
162 // Parameters:
163 // - _: leading realm-call discriminator; callers pass 0.
164 // - rlm: propagated realm context; it must be the current realm or the method
165 // returns ErrSpoofedRealm before writing.
166 // - feeAmountTickSpacing: non-nil mapping from fee tiers to their required
167 // int32 tick spacing values.
168 //
169 // Returns:
170 // - err: nil when the mapping is stored; ErrSpoofedRealm for a non-current
171 // realm, or the underlying KV-store write error.
172 func (s *poolStore) SetFeeAmountTickSpacing(_ int , rlm realm, feeAmountTickSpacing map [ uint32 ] int32 ) error {
173 if !rlm.IsCurrent() {
174 return errors.New(ErrSpoofedRealm)
175 }
176
177 if feeAmountTickSpacing == nil {
178 panic( "feeAmountTickSpacing is nil" )
179 }
180
181 return s.kvStore.Set( 0 , rlm, StoreKeyFeeAmountTickSpacing.String(), feeAmountTickSpacing)
182 }
183
184 // Returns:
185 // - exists: true when the slot0 protocol-fee configuration key is present in
186 // the KV store.
187 func (s *poolStore) HasSlot0FeeProtocol() bool {
188 return s.kvStore.Has(StoreKeySlot0FeeProtocol.String())
189 }
190
191 // GetSlot0FeeProtocol retrieves the protocol fee denominator(s) for slot0.
192 // Returns:
193 // - slot0FeeProtocol: packed protocol-fee denominator configuration for
194 // slot0; panics if the KV value cannot be read or has the wrong type.
195 func (s *poolStore) GetSlot0FeeProtocol() uint8 {
196 result, err := s.kvStore.Get(StoreKeySlot0FeeProtocol.String())
197 if err != nil {
198 panic(err)
199 }
200
201 slot0FeeProtocol, ok := result.( uint8 )
202 if !ok {
203 panic(ufmt.Sprintf( "failed to cast result to uint8: %T" , result))
204 }
205
206 return slot0FeeProtocol
207 }
208
209 // SetSlot0FeeProtocol stores the protocol fee denominator(s) for slot0.
210 // Parameters:
211 // - _: leading realm-call discriminator; callers pass 0.
212 // - rlm: propagated realm context; it must be the current realm or the method
213 // returns ErrSpoofedRealm before writing.
214 // - slot0FeeProtocol: packed uint8 protocol-fee denominators for token0 and
215 // token1.
216 //
217 // Returns:
218 // - err: nil when the protocol-fee configuration is stored; ErrSpoofedRealm
219 // for a non-current realm, or the underlying KV-store write error.
220 func (s *poolStore) SetSlot0FeeProtocol(_ int , rlm realm, slot0FeeProtocol uint8 ) error {
221 if !rlm.IsCurrent() {
222 return errors.New(ErrSpoofedRealm)
223 }
224
225 return s.kvStore.Set( 0 , rlm, StoreKeySlot0FeeProtocol.String(), slot0FeeProtocol)
226 }
227
228 // Returns:
229 // - exists: true when the pool-creation-fee key is present in the KV store.
230 func (s *poolStore) HasPoolCreationFee() bool {
231 return s.kvStore.Has(StoreKeyPoolCreationFee.String())
232 }
233
234 // GetPoolCreationFee retrieves the pool creation fee amount.
235 // Returns:
236 // - poolCreationFee: configured pool-creation charge in the chain's smallest
237 // currency unit; panics if the KV value cannot be read or has the wrong type.
238 func (s *poolStore) GetPoolCreationFee() int64 {
239 result, err := s.kvStore.Get(StoreKeyPoolCreationFee.String())
240 if err != nil {
241 panic(err)
242 }
243
244 poolCreationFee, ok := result.( int64 )
245 if !ok {
246 panic(ufmt.Sprintf( "failed to cast result to int64: %T" , result))
247 }
248
249 return poolCreationFee
250 }
251
252 // SetPoolCreationFee stores the pool creation fee amount.
253 // Parameters:
254 // - _: leading realm-call discriminator; callers pass 0.
255 // - rlm: propagated realm context; it must be the current realm or the method
256 // returns ErrSpoofedRealm before writing.
257 // - poolCreationFee: pool-creation charge in the chain's smallest currency
258 // unit.
259 //
260 // Returns:
261 // - err: nil when the fee is stored; ErrSpoofedRealm for a non-current realm,
262 // or the underlying KV-store write error.
263 func (s *poolStore) SetPoolCreationFee(_ int , rlm realm, poolCreationFee int64 ) error {
264 if !rlm.IsCurrent() {
265 return errors.New(ErrSpoofedRealm)
266 }
267
268 return s.kvStore.Set( 0 , rlm, StoreKeyPoolCreationFee.String(), poolCreationFee)
269 }
270
271 // Returns:
272 // - exists: true when the pending protocol-fees key is present in the KV store.
273 func (s *poolStore) HasPendingProtocolFees() bool {
274 return s.kvStore.Has(StoreKeyPendingProtocolFees.String())
275 }
276
277 // Returns:
278 // - pendingProtocolFees: mapping from token path to pending protocol-fee
279 // amount in the chain's smallest currency unit; panics if the KV value
280 // cannot be read or has the wrong type.
281 func (s *poolStore) GetPendingProtocolFees() map [ string ] int64 {
282 result, err := s.kvStore.Get(StoreKeyPendingProtocolFees.String())
283 if err != nil {
284 panic(err)
285 }
286
287 pendingProtocolFees, ok := result.( map [ string ] int64 )
288 if !ok {
289 panic(ufmt.Sprintf( "failed to cast result to map[string]int64: %T" , result))
290 }
291
292 return pendingProtocolFees
293 }
294
295 // Parameters:
296 // - _: leading realm-call discriminator; callers pass 0.
297 // - rlm: propagated realm context; it must be the current realm or the method
298 // returns ErrSpoofedRealm before writing.
299 // - pendingProtocolFees: token-path-to-amount mapping; amounts are in the
300 // chain's smallest currency unit and are copied before storage.
301 //
302 // Returns:
303 // - err: nil when the copied mapping is stored; ErrSpoofedRealm for a
304 // non-current realm, or the underlying KV-store write error.
305 func (s *poolStore) SetPendingProtocolFees(_ int , rlm realm, pendingProtocolFees map [ string ] int64 ) error {
306 if !rlm.IsCurrent() {
307 return errors.New(ErrSpoofedRealm)
308 }
309
310 // The map is copied here so it is allocated by, and therefore mutable from, this realm.
311 owned := make( map [ string ] int64 , len(pendingProtocolFees))
312 for tokenPath, amount := range pendingProtocolFees {
313 owned[tokenPath] = amount
314 }
315
316 return s.kvStore.Set( 0 , rlm, StoreKeyPendingProtocolFees.String(), owned)
317 }
318
319 // Parameters:
320 // - tokenPath: token contract path used as the pending-fee map key.
321 //
322 // Returns:
323 // - amount: pending protocol-fee amount for tokenPath in the chain's smallest
324 // currency unit, or zero when no entry exists.
325 func (s *poolStore) GetPendingProtocolFee(tokenPath string ) int64 {
326 return s.GetPendingProtocolFees()[tokenPath]
327 }
328
329 // Parameters:
330 // - _: leading realm-call discriminator; callers pass 0.
331 // - rlm: propagated realm context; it must be the current realm or the method
332 // returns ErrSpoofedRealm before writing.
333 // - tokenPath: token contract path identifying the pending-fee entry.
334 // - amount: pending protocol-fee amount to assign for tokenPath, in the
335 // chain's smallest currency unit.
336 //
337 // Returns:
338 // - err: nil after the map entry is updated; ErrSpoofedRealm for a non-current
339 // realm, or store.ErrWritePermissionDenied for an unauthorized code realm.
340 func (s *poolStore) SetPendingProtocolFee(_ int , rlm realm, tokenPath string , amount int64 ) error {
341 if !rlm.IsCurrent() {
342 return errors.New(ErrSpoofedRealm)
343 }
344
345 if rlm.IsCode() && !s.kvStore.IsWriteAuthorized(rlm.Address()) {
346 return errors.New(store.ErrWritePermissionDenied)
347 }
348
349 s.GetPendingProtocolFees()[tokenPath] = amount
350
351 return nil
352 }
353
354 // Parameters:
355 // - _: leading realm-call discriminator; callers pass 0.
356 // - rlm: propagated realm context; it must be the current realm or the method
357 // returns ErrSpoofedRealm before writing.
358 // - tokenPath: token contract path identifying the pending-fee entry to delete.
359 //
360 // Returns:
361 // - err: nil after the map entry is removed; ErrSpoofedRealm for a non-current
362 // realm, or store.ErrWritePermissionDenied for an unauthorized code realm.
363 func (s *poolStore) RemovePendingProtocolFee(_ int , rlm realm, tokenPath string ) error {
364 if !rlm.IsCurrent() {
365 return errors.New(ErrSpoofedRealm)
366 }
367
368 if rlm.IsCode() && !s.kvStore.IsWriteAuthorized(rlm.Address()) {
369 return errors.New(store.ErrWritePermissionDenied)
370 }
371
372 delete(s.GetPendingProtocolFees(), tokenPath)
373
374 return nil
375 }
376
377 // Returns:
378 // - exists: true when the withdrawal-fee key is present in the KV store.
379 func (s *poolStore) HasWithdrawalFeeBPS() bool {
380 return s.kvStore.Has(StoreKeyWithdrawalFeeBPS.String())
381 }
382
383 // GetWithdrawalFeeBPS retrieves the withdrawal fee in basis points.
384 // Returns:
385 // - withdrawalFeeBPS: withdrawal fee expressed in basis points (1/100 of a
386 // percent); panics if the KV value cannot be read or has the wrong type.
387 func (s *poolStore) GetWithdrawalFeeBPS() uint64 {
388 result, err := s.kvStore.Get(StoreKeyWithdrawalFeeBPS.String())
389 if err != nil {
390 panic(err)
391 }
392
393 withdrawalFeeBPS, ok := result.( uint64 )
394 if !ok {
395 panic(ufmt.Sprintf( "failed to cast result to uint64: %T" , result))
396 }
397
398 return withdrawalFeeBPS
399 }
400
401 // SetWithdrawalFeeBPS stores the withdrawal fee in basis points.
402 // Parameters:
403 // - _: leading realm-call discriminator; callers pass 0.
404 // - rlm: propagated realm context; it must be the current realm or the method
405 // returns ErrSpoofedRealm before writing.
406 // - withdrawalFeeBPS: withdrawal fee in basis points, where 100 basis points
407 // equals one percent.
408 //
409 // Returns:
410 // - err: nil when the fee is stored; ErrSpoofedRealm for a non-current realm,
411 // or the underlying KV-store write error.
412 func (s *poolStore) SetWithdrawalFeeBPS(_ int , rlm realm, withdrawalFeeBPS uint64 ) error {
413 if !rlm.IsCurrent() {
414 return errors.New(ErrSpoofedRealm)
415 }
416
417 return s.kvStore.Set( 0 , rlm, StoreKeyWithdrawalFeeBPS.String(), withdrawalFeeBPS)
418 }
419
420 // Returns:
421 // - exists: true when the global unlocked-state key is present in the KV store.
422 func (s *poolStore) HasUnlocked() bool {
423 return s.kvStore.Has(StoreKeyUnlocked.String())
424 }
425
426 // Returns:
427 // - unlocked: the persisted global reentrancy-lock state; panics if the KV
428 // value cannot be read or has the wrong type.
429 func (s *poolStore) GetUnlocked() bool {
430 result, err := s.kvStore.Get(StoreKeyUnlocked.String())
431 if err != nil {
432 panic(err)
433 }
434
435 unlocked, ok := result.( bool )
436 if !ok {
437 panic(ufmt.Sprintf( "failed to cast result to bool: %T" , result))
438 }
439
440 return unlocked
441 }
442
443 // Parameters:
444 // - _: leading realm-call discriminator; callers pass 0.
445 // - rlm: propagated realm context; it must be the current realm or the method
446 // returns ErrSpoofedRealm before writing.
447 // - unlocked: true when pool operations may proceed without the global lock.
448 //
449 // Returns:
450 // - err: nil when the lock state is stored; ErrSpoofedRealm for a non-current
451 // realm, or the underlying KV-store write error.
452 func (s *poolStore) SetUnlocked(_ int , rlm realm, unlocked bool ) error {
453 if !rlm.IsCurrent() {
454 return errors.New(ErrSpoofedRealm)
455 }
456
457 return s.kvStore.Set( 0 , rlm, StoreKeyUnlocked.String(), unlocked)
458 }
459
460 // HasSwapStartHook checks if the swap start hook is set.
461 // Returns:
462 // - exists: true when a swap-start hook key is present in the KV store.
463 func (s *poolStore) HasSwapStartHook() bool {
464 return s.kvStore.Has(StoreKeySwapStartHook.String())
465 }
466
467 // GetSwapStartHook retrieves the swap start hook function.
468 // Returns:
469 // - swapStartHook: stored callback invoked at swap start with the current
470 // realm, pool path, and block timestamp; panics if the KV value cannot be
471 // read or has the wrong function type.
472 func (s *poolStore) GetSwapStartHook() func (cur realm, poolPath string , timestamp int64 ) {
473 result, err := s.kvStore.Get(StoreKeySwapStartHook.String())
474 if err != nil {
475 panic(err)
476 }
477
478 swapStartHook, ok := result.( func (cur realm, poolPath string , timestamp int64 ))
479 if !ok {
480 panic(ufmt.Sprintf( "failed to cast result to func(poolPath string, timestamp int64): %T" , result))
481 }
482
483 return swapStartHook
484 }
485
486 // SetSwapStartHook stores the swap start hook function.
487 // Parameters:
488 // - _: leading realm-call discriminator; callers pass 0.
489 // - rlm: propagated realm context; it must be the current realm or the method
490 // returns ErrSpoofedRealm before writing.
491 // - swapStartHook: callback receiving the current realm, pool path, and
492 // block timestamp when a swap starts.
493 //
494 // Returns:
495 // - err: nil when the callback is stored; ErrSpoofedRealm for a non-current
496 // realm, or the underlying KV-store write error.
497 func (s *poolStore) SetSwapStartHook(_ int , rlm realm, swapStartHook func (cur realm, poolPath string , timestamp int64 )) error {
498 if !rlm.IsCurrent() {
499 return errors.New(ErrSpoofedRealm)
500 }
501
502 return s.kvStore.Set( 0 , rlm, StoreKeySwapStartHook.String(), swapStartHook)
503 }
504
505 // HasSwapEndHook checks if the swap end hook is set.
506 // Returns:
507 // - exists: true when a swap-end hook key is present in the KV store.
508 func (s *poolStore) HasSwapEndHook() bool {
509 return s.kvStore.Has(StoreKeySwapEndHook.String())
510 }
511
512 // GetSwapEndHook retrieves the swap end hook function.
513 // Returns:
514 // - swapEndHook: stored callback receiving the current realm and pool path at
515 // swap end and returning an error; panics if the KV value cannot be read or
516 // has the wrong function type.
517 func (s *poolStore) GetSwapEndHook() func (cur realm, poolPath string ) error {
518 result, err := s.kvStore.Get(StoreKeySwapEndHook.String())
519 if err != nil {
520 panic(err)
521 }
522
523 swapEndHook, ok := result.( func (cur realm, poolPath string ) error )
524 if !ok {
525 panic(ufmt.Sprintf( "failed to cast result to func(poolPath string): %T" , result))
526 }
527
528 return swapEndHook
529 }
530
531 // SetSwapEndHook stores the swap end hook function.
532 // Parameters:
533 // - _: leading realm-call discriminator; callers pass 0.
534 // - rlm: propagated realm context; it must be the current realm or the method
535 // returns ErrSpoofedRealm before writing.
536 // - swapEndHook: callback receiving the current realm and pool path at swap
537 // end and returning any hook error.
538 //
539 // Returns:
540 // - err: nil when the callback is stored; ErrSpoofedRealm for a non-current
541 // realm, or the underlying KV-store write error.
542 func (s *poolStore) SetSwapEndHook(_ int , rlm realm, swapEndHook func (cur realm, poolPath string ) error ) error {
543 if !rlm.IsCurrent() {
544 return errors.New(ErrSpoofedRealm)
545 }
546
547 return s.kvStore.Set( 0 , rlm, StoreKeySwapEndHook.String(), swapEndHook)
548 }
549
550 // HasTickCrossHook checks if the tick cross hook is set.
551 // Returns:
552 // - exists: true when a tick-cross hook key is present in the KV store.
553 func (s *poolStore) HasTickCrossHook() bool {
554 return s.kvStore.Has(StoreKeyTickCrossHook.String())
555 }
556
557 // GetTickCrossHook retrieves the tick cross hook function.
558 // Returns:
559 // - tickCrossHook: stored callback receiving the current realm, pool path,
560 // crossed tick, swap direction, and block timestamp; panics if the KV value
561 // cannot be read or has the wrong function type.
562 func (s *poolStore) GetTickCrossHook() func (cur realm, poolPath string , tickId int32 , zeroForOne bool , timestamp int64 ) {
563 result, err := s.kvStore.Get(StoreKeyTickCrossHook.String())
564 if err != nil {
565 panic(err)
566 }
567
568 tickCrossHook, ok := result.( func (cur realm, poolPath string , tickId int32 , zeroForOne bool , timestamp int64 ))
569 if !ok {
570 panic(ufmt.Sprintf( "failed to cast result to func(poolPath string, tickId int32, zeroForOne bool, timestamp int64): %T" , result))
571 }
572
573 return tickCrossHook
574 }
575
576 // SetTickCrossHook stores the tick cross hook function.
577 // Parameters:
578 // - _: leading realm-call discriminator; callers pass 0.
579 // - rlm: propagated realm context; it must be the current realm or the method
580 // returns ErrSpoofedRealm before writing.
581 // - tickCrossHook: callback receiving the current realm, pool path, crossed
582 // tick ID, swap direction, and block timestamp.
583 //
584 // Returns:
585 // - err: nil when the callback is stored; ErrSpoofedRealm for a non-current
586 // realm, or the underlying KV-store write error.
587 func (s *poolStore) SetTickCrossHook(_ int , rlm realm, tickCrossHook func (cur realm, poolPath string , tickId int32 , zeroForOne bool , timestamp int64 )) error {
588 if !rlm.IsCurrent() {
589 return errors.New(ErrSpoofedRealm)
590 }
591
592 return s.kvStore.Set( 0 , rlm, StoreKeyTickCrossHook.String(), tickCrossHook)
593 }
594
595 // NewPoolStore creates a new pool store instance with the provided KV store.
596 // This function is used by the upgrade system to create storage instances for each implementation.
597 // Parameters:
598 // - kvStore: KV store used to persist and retrieve pool-domain state.
599 //
600 // Returns:
601 // - poolStore: an IPoolStore implementation backed by kvStore.
602 func NewPoolStore(kvStore store.KVStore) IPoolStore {
603 return &poolStore{
604 kvStore: kvStore,
605 }
606 }
607
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.