Pool

pool

Description

This contract implements V3 like functionality of the pool with concentrated liquidity.

Due to the new storage organization and availability of the dict data type we don't need the tickBitmap data structures. However, gas consumption while using the dict is also quite significant

Data Storage

Index
Type
Size (b/r)
Cell
Name
Description

1

addr

267 / 0

1

poolv3::router_address

Address of the router contract that created this pool (totally immutable set at creation )

2

uint16

16 / 0

1

poolv3::lp_fee_base

Liquidity provider fee. base in FEE_DENOMINATOR parts

3

uint16

16 / 0

1

poolv3::protocol_fee

Protocol fee in FEE_DENOMINATOR

4

uint16

16 / 0

1

poolv3::lp_fee_current

Current value of the pool fee, in case of dynamic adjustment

5

addr

267 / 0

1

poolv3::jetton0_wallet

Address of the 0 token in the pool. This is an address of the jetton0 wallet attached to router

6

addr

267 / 0

1

poolv3::jetton1_wallet

Address of the 1 token in the pool This is an address of the jetton0 wallet attached to router

7

int24

24 / 0

1

poolv3::tick_spacing

Spacing of the ticks, 24 bits of signed int would be used

8

uint64

64 / 0

1

poolv3::seqno

Used by indexer to ensure that none of pool interactions are skipped

9

uint256

256 / 0

11

poolv3::feeGrowthGlobal0X128

This variable stores current collected fee per the unit of liquidity in jetton0

10

uint256

256 / 0

11

poolv3::feeGrowthGlobal1X128

This variable stores current collected fee per the unit of liquidity in jetton0

11

uint128

128 / 0

11

poolv3::collectedProtocolFee0

Collected protocol fee of the jetton0

12

uint128

128 / 0

11

poolv3::collectedProtocolFee1

Collected protocol fee of the jetton1

13

coins

124 / 0

11

poolv3::reserve0

These are additional separate protection system - it calculates the reserves of the pool In case main math has a bug it protects the funds of other pools. Reserve of the jetton0

14

coins

124 / 0

11

poolv3::reserve1

Reserve of the jetton1

15

uint1

1 / 0

12

poolv3::pool_active

Pool acitve flag 0 is inactive, 1 is active

16

int24

24 / 0

12

poolv3::tick

Current tick, signed, 24 bits would be used. Pool maintains it in correspondence to poolv3::price_sqrt

17

uint160

160 / 0

12

poolv3::price_sqrt

Current square root of the price in Q64.96 format using 160 bits

18

uint128

128 / 0

12

poolv3::liquidity

Current active concentrated liquidity in 128 bits

19

uint24

24 / 0

12

poolv3::occupied_ticks

number of occupied ticks in storage

20

uint64

64 / 0

12

poolv3::nftv3item_counter

Pool is also an NFT collection. So this is the counter of currently minted positions

21

uint64

64 / 0

12

poolv3::nftv3items_active

Pool is also an NFT collection. Number of unburnt items

22

addr

267 / 0

12

poolv3::admin_address

Admin address. Can init pool

23

addr

267 / 0

12

poolv3::controller_address

Controller address. Can change fee and lock and unlock pool

24

addr

267 / 0

121

poolv3::jetton0_minter

Address of the 0 token minter. Beta only.

25

addr

267 / 0

121

poolv3::jetton1_minter

Address of the 1 token minter. Beta only.

26

dict

0 / 1

13

poolv3::ticks_dictionary

Storage of the ticks

27

code

0 / 1

14

poolv3::accountv3_code

Pool knows how to create user accounts to store fund pairs for a particular user

28

code

0 / 1

14

poolv3::position_nftv3_code

Pool knows how to create user position. So it stores it's code

29

cell

0 / 1

14

poolv3::nftv3_content

packed metadata that would be given to nft that corresponds to nft collection

30

cell

0 / 1

14

poolv3::nftv3item_content

packed metadata that would be given to nft that corresponds to the position

Cells

Name
Size
Free

1

937

86

11

1016

7

12

999

24

13

0

1023

14

0

1023

121

534

489

Interface

getIsActive

(int) getIsActive ()

Returns is pool is active

Return Values

#
Type
Description

0

int

int containing the poolv3::pool_active

getPoolStateAndConfiguration

(slice, slice, slice, slice, slice, slice, slice, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int ) getPoolStateAndConfiguration ()

Returns pool state and configuration

Return Values

#
Type
Description

0

slice

Router address

1

slice

Admin address

2

slice

Controller address

3

slice

Jetton 0 Wallet address. The wallet is owned by the Router

4

slice

Jetton 1 Wallet address. The wallet is owned by the Router

5

slice

Jetton 0 Minter address.

6

slice

Jetton 1 Minter address.

7

int

Flag that denotes if the pool is active

8

int

Pool tick spacing

9

int

Fee that is used as a base. Stored in x 1/10000

10

int

Fee that protocol takes. Stored in x 1/10000

11

int

Fee that is currently active. Stored in x 1/10000

12

int

Current tick

13

int

Current price

14

int

Current liquidity

15

int

poolv3::feeGrowthGlobal0X128

16

int

poolv3::feeGrowthGlobal1X128

17

int

Amount of jetton0 fee collected for protocol owners

18

int

Amount of jetton0 fee collected for protocol owners

19

int

Number of total minted NFT positions

20

int

Reserves of the jetton0

21

int

Reserves of the jetton1

22

int

Number of active NFT positions

23

int

Number of currently occupied ticks

24

int

Number of operations with pool since the deploy

getChildContracts

(cell, cell, cell, cell) getChildContracts ()

Return Values

#
Type
Description

0

cell

code of the account contract

1

cell

code of the nft position contract

2

cell

metadata for NFT Collection

3

cell

metadata for NFT Item

getAllTickInfos

(cell) getAllTickInfos ()

returns the cell with all the ticks.

Return Values

#
Type
Description

0

cell

cell that contains the dict with all the ticks.

getTickInfosFrom

(tuple) getTickInfosFrom (int key, int amount, int dir, int full)

Returns ticks starting form key (non-inclusive)

  • 0 forward

  • 1 backward

Parameters

#
Type
Name
Description

0

int

key

key (tick number) from which to get data

1

int

amount

amount of ticks to get (large values would fail with out of gas)

2

int

dir

0 - for forward search, 1 - for backward

3

int

full

with true (non zero) would fill fee counter values

getCollectedFees

(int, int) getCollectedFees (int tickLower, int tickUpper, int posLiquidityDelta, int posFeeGrowthInside0X128, int posFeeGrowthInside1X128)

Predicts how much fees a position can collect

Parameters

#
Type
Name
Description

0

int

tickLower

1

int

tickUpper

2

int

posLiquidityDelta

3

int

posFeeGrowthInside0X128

4

int

posFeeGrowthInside1X128

Return Values

#
Type
Description

0

int

amount of jetton0 that is collected

1

int

amount of jetton1 that is collected

getUserAccountAddress

(slice) getUserAccountAddress (slice user_address)

computes user account address for a given user

Parameters

#
Type
Name
Description

0

slice

user_address

address for witch account address is requested

Return Values

#
Type
Description

0

slice

account address

getMintEstimate

(int, int, int) getMintEstimate (int tickLower, int tickUpper, int liquidity)

Computes estimates for the mint

Parameters

#
Type
Name
Description

0

int

tickLower

lower tick for the desired position

1

int

tickUpper

upper tick for the desired position

2

int

liquidity

liquidity that is planned to be minted

Return Values

#
Type
Description

0

int

amount of jetton0 needed to mint the position

1

int

amount of jetton1 needed to mint the position

2

int

error code that shows if the basic checks for the mint would succeed

getSwapEstimate

(int, int) getSwapEstimate (int zeroForOne, int amount, int sqrtPriceLimitX96)

Deprecated. Use getSwapEstimateGas instead

Computes estimates fot the swap

Parameters

#
Type
Name
Description

0

int

zeroForOne

direction of the swap zeroForOne !=0 - swap jetton0 for jetton1, otherwise jetton1 for jetton0

1

int

amount

amount of input token for the swap

2

int

sqrtPriceLimitX96

limit price (formatted as fixed point 64.96 square root of the price).If reached - swap will stop

Return Values

#
Type
Description

0

int

amount of jetton0 that would be put to/get from the pool

1

int

amount of jetton1 that would be put to/get from the pool

getSwapEstimateGas

(int, int) getSwapEstimateGas (int zeroForOne, int amount, int sqrtPriceLimitX96, int minOutAmount, int gasLimit)

Computes estimates for the swap

Parameters

#
Type
Name
Description

0

int

zeroForOne

direction of the swap zeroForOne !=0 - swap jetton0 for jetton1, otherwise jetton1 for jetton0

1

int

amount

amount of input token for the swap

2

int

sqrtPriceLimitX96

limit price (formatted as fixed point 64.96 square root of the price).If reached - swap will stop (swap would succeed remaining input amount would return as change )

3

int

minOutAmount

minimum amount. If return value would be less than this, swap will be reverted

4

int

gasLimit

amount of gas (in gas units). If gasLimit is 0 - default value is used - that equals to contract gas limit from the config

Return Values

#
Type
Description

0

int

amount of jetton0 that would be put to/get from the pool

1

int

amount of jetton1 that would be put to/get from the pool

get_collection_data

(int, cell, slice) get_collection_data ()

In accordance with TEP-62

Return Values

#
Type
Description

0

int

poolv3::nftv3item_counter

1

cell

poolv3::nftv3_content

2

slice

poolv3::router_address

get_nft_address_by_index

(slice) get_nft_address_by_index (int index)

In accordance with TEP-62

Parameters

#
Type
Name
Description

0

int

index

index of the requested NFT (Position NFT)

Return Values

#
Type
Description

0

slice

address of the Position NFT

get_nft_content

(cell) get_nft_content (int index, cell nftv3item_content)

In accordance with TEP-62 we will form the output NFT onchain metadata

If NFTItemContent "description" field that is passed to the pool by the pool administrator (poolv3::nftv3item_content) begins with marker "%N%", data from the NFT is added to the beginning of the "description" field. If there is no data attached to the dictionary by the NFT, NFTItemContent description is unchanged

Parameters

#
Type
Name
Description

0

int

index

index of the requested NFT

1

cell

nftv3item_content

NFT content returned from the get_nft_data() of the NFT

Return Values

#
Type
Description

0

cell

cell with metadata dict()

Messages

POOLV3_INIT

Opcode : 0x441c39ed

The first mandatory operation that fills crucial parameters of the pool

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

from_admin

Uint(1),Bool

Flag that shows if this message goes from router admin or pool factory

has_admin

Uint(1),Bool

Flag that shows if this message have a new admin address

admin_addr

Address(267)

New address of the admin. If has_admin is false could be 00b

has_controller

Uint(1),Bool

Flag that shows if this message have a new controller address

controller_addr

Address(267)

Address that is allowed to change the fee. Can always be updated by admin. If has_controller is false could be 00b

set_spacing

Uint(1),Bool

Flag that shows if tick_spacing should be set to the pool or ignored

tick_spacing

Int(24)

Tick spacing to be used in the pool

set_price

Uint(1),Bool

Flag that shows if initial_priceX96 should be set to the pool or ignored

initial_priceX96

Uint(160),PriceX96

Initial price for the pool

set_active

Uint(1),Bool

Flag that shows if pool_active should be set to the pool or ignored

pool_active

Uint(1),Bool

Flag is we should start the pool as unlocked

protocol_fee

Uint(16),Fee

Liquidity provider fee. base in FEE_DENOMINATOR parts. If value is more than 10000 value would be default

lp_fee_base

Uint(16),Fee

Protocol fee in FEE_DENOMINATOR. If value is more than 10000 value would be default

lp_fee_current

Uint(16),Fee

Current value of the pool fee, in case of dynamic adjustment. If value is more than 10000 value would be default

nftv3_content

Cell(0),Metadata

Metadata for the NFT Collection

nftv3item_content

Cell(0),Metadata

Metadata for the NFT Item

0

Maybe Cell(1) minter_cell

Cell With Minters

0

jetton0_minter

Address(267)

Address of the jetton0 minter, used by indexer and frontend

0

jetton1_minter

Address(267)

Address of the jetton1 minter, used by indexer and frontend

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_INIT
POOLV3_INIT#441c39ed 
    query_id:uint64
    from_admin:uint1
    has_admin:uint1
    admin_addr:MsgAddress
    has_controller:uint1
    controller_addr:MsgAddress
    set_spacing:uint1
    tick_spacing:int24
    set_price:uint1
    initial_priceX96:uint160
    set_active:uint1
    pool_active:uint1
    protocol_fee:uint16
    lp_fee_base:uint16
    lp_fee_current:uint16
    nftv3_content:Cell
    nftv3item_content:Cell
    minter_cell:(Maybe ^[
        jetton0_minter:MsgAddress
        jetton1_minter:MsgAddress
    ] ) 
= ContractMessages;

POOLV3_LOCK

Opcode : 0x5e74697

This operation locks the pool. This is allowed to do by the operator and the admin

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_LOCK
POOLV3_LOCK#5e74697 
    query_id:uint64
= ContractMessages;

POOLV3_UNLOCK

Opcode : 0x3205adbd

This operation locks the pool. This is allowed to do by the operator and the admin

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_UNLOCK
POOLV3_UNLOCK#3205adbd 
    query_id:uint64
= ContractMessages;

POOLV3_MINT

Opcode : 0x81702ef8

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

amount0Funded

Coins(124)

Amount of jetton 0 received by router for the mint

amount1Funded

Coins(124)

Amount of jetton 1 recived by router for the mint

recipient

Address(267)

Address that would receive the minted NFT, excesses and refunds

liquidity

Uint(128)

Amount of liquidity to mint

tickLower

Int(24)

lower bound of the range in which to mint

tickUpper

Int(24)

upper bound of the range in which to mint

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_MINT
POOLV3_MINT#81702ef8 
    query_id:uint64
    amount0Funded:(VarUInteger 16)
    amount1Funded:(VarUInteger 16)
    recipient:MsgAddress
    liquidity:uint128
    tickLower:int24
    tickUpper:int24
= ContractMessages;

POOLV3_BURN

Opcode : 0xd73ac09d

Burn whole or part of nft. Is sent by Position NFT itself, would only be accepted from the correct NFT itself

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

recipient

Address(267)

NFT owner to receive funds

burned_index

Uint(64)

Index if the NFT to burn. Should match the sender address

liquidity

Uint(128)

NFT liquidity amount prior to burn

tickLower

Int(24)

Lower tick of the NFT. Sanitized by NFTPosition contract

tickUpper

Int(24)

Upper tick of the NFT. Sanitized by NFTPosition contract

liquidity2Burn

Uint(128)

Amount of the liquidity to burn, 0 is a valid amount, in this case only collected fees would be returned

0

Cell(0) old_fee_cell

Fee counters to collect from

0

feeGrowthInside0LastX128

Uint(256),x128

Fee counter inside position range for jetton0, per unit of liquidity, in 128.128 fixed point

0

feeGrowthInside1LastX128

Uint(256),x128

Fee counter inside position range for jetton1, per unit of liquidity, in 128.128 fixed point

1

Cell(0) new_fee_cell

Fee counters to collect to (Used by indexer)

1

feeGrowthInside0CurrentX128

Uint(256),x128,Indexer

Fee counter inside position range for jetton0, per unit of liquidity, in 128.128 fixed point

1

feeGrowthInside1CurrentX128

Uint(256),x128,Indexer

Fee counter inside position range for jetton1, per unit of liquidity, in 128.128 fixed point

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_BURN
POOLV3_BURN#d73ac09d 
    query_id:uint64
    recipient:MsgAddress
    burned_index:uint64
    liquidity:uint128
    tickLower:int24
    tickUpper:int24
    liquidity2Burn:uint128
    old_fee_cell:^[
        feeGrowthInside0LastX128:uint256
        feeGrowthInside1LastX128:uint256
    ]  
    new_fee_cell:^[
        feeGrowthInside0CurrentX128:uint256
        feeGrowthInside1CurrentX128:uint256
    ]  
= ContractMessages;

POOLV3_SET_FEE

Opcode : 0x6bdcbeb8

This operation sets the fee values for the pool. This is allowed to do by the operator and the admin

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

protocol_fee

Uint(16)

Liquidity provider fee. base in FEE_DENOMINATOR parts

lp_fee_base

Uint(16)

Protocol fee in FEE_DENOMINATOR

lp_fee_current

Uint(16)

Current value of the pool fee, in case of dynamic adjustment

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_SET_FEE
POOLV3_SET_FEE#6bdcbeb8 
    query_id:uint64
    protocol_fee:uint16
    lp_fee_base:uint16
    lp_fee_current:uint16
= ContractMessages;

POOLV3_FUND_ACCOUNT

Opcode : 0x4468de77

Proxy proof of the jettons funding and mint request to the AccountV3. For more information refer to AccountV3

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

owner_addr

Address(267)

Address that would receive the minted NFT, excesses and refunds

amount0

Coins(124)

Amount of jetton0 that is funded for the mint

amount1

Coins(124)

Amount of jetton1 that is funded for the mint

enough0

Coins(124)

Minimum amount of jetton0 totally collected on the account that is required to start the mint

enough1

Coins(124)

Minimum amount of jetton1 totally collected on the account that is required to start the mint

liquidity

Uint(128)

Amount of liquidity to mint

tickLower

Int(24)

lower bound of the range in which to mint

tickUpper

Int(24)

upper bound of the range in which to mint

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_FUND_ACCOUNT
POOLV3_FUND_ACCOUNT#4468de77 
    query_id:uint64
    owner_addr:MsgAddress
    amount0:(VarUInteger 16)
    amount1:(VarUInteger 16)
    enough0:(VarUInteger 16)
    enough1:(VarUInteger 16)
    liquidity:uint128
    tickLower:int24
    tickUpper:int24
= ContractMessages;

POOLV3_START_BURN

Opcode : 0x530b5f2c

Burn whole or part of nft. Can be called by anyone, but if not called be the owner - would fail later. This operation would compute the amount of the fees that the position is eligible to get and then forwards a message to the Position NFT contract

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

burned_index

Uint(64)

Index if the NFT to burn

liquidity2Burn

Uint(128)

Amount of the liquidity to burn, 0 is a valid amount, in this case only collected fees would be returned

tickLower

Int(24)

Lower tick of the NFT. Should match the real one

tickUpper

Int(24)

Upper tick of the NFT. Should match the real one

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_START_BURN
POOLV3_START_BURN#530b5f2c 
    query_id:uint64
    burned_index:uint64
    liquidity2Burn:uint128
    tickLower:int24
    tickUpper:int24
= ContractMessages;

POOLV3_SWAP

Opcode : 0xa7fb58f8

Computes the swap math, and issues a command to the router to send funds. Only would be accepted from the router This operation we have several input parameters that would affect the result of the swap

Condition
Swap result
Returned Change
Error Code

Swap finished sqrtPriceLimitX96 not reached. minOutAmount surpassed

total output number of coins

0

RESULT_SWAP_OK

Swap finished minOutAmount not surpassed

0

amount

RESULT_SWAP_OUTPUT_TOO_SMALL

Swap reached sqrtPriceLimitX96 after changing part1 coins. minOutAmount surpassed

output number of coins

amount - part1

RESULT_SWAP_OK

Access Rights: This operation is allowed for poolv3::router_address

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

owner_address

Address(267)

Owner of the liquidity in swap

source_wallet

Address(267)

jetton wallet attached to the router. used to identify swap direction

0

Cell(0) params_cell

Fee counters To (Used by indexer)

0

amount

Coins(124)

Input amount of the jettons to be swapped

0

sqrtPriceLimitX96

Uint(160),PriceX96

Limit marginal price. Swap won't go beyond it.

0

minOutAmount

Coins(124)

Minimum amount of the output jettons to get back. If not reached, your input would be returned to you

1

Cell(0) payloads_cell

Cell with payloads for swap result and change

1

target_address

Address(267)

Target will receive the result of the swap. Could be addr_none() (*00b*) then owner_address is used

1

ok_forward_amount

Coins(124)

Amount of TON to use for forward payload that would be sent with the result of the swap

1

ok_forward_payload

Cell(0),Maybe,Payload

Payload that would be sent with the jettons of the result of the swap

1

ret_forward_amount

Coins(124)

Amount of TON to use for forward payload that would be sent with the change for the swap (if any)

1

ret_forward_payload

Cell(0),Maybe,Payload

Payload that would be sent with the jettons of the change of the swap (if any)

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for POOLV3_SWAP
POOLV3_SWAP#a7fb58f8 
    query_id:uint64
    owner_address:MsgAddress
    source_wallet:MsgAddress
    params_cell:^[
        amount:(VarUInteger 16)
        sqrtPriceLimitX96:uint160
        minOutAmount:(VarUInteger 16)
    ]  
    payloads_cell:^[
        target_address:MsgAddress
        ok_forward_amount:(VarUInteger 16)
        ok_forward_payload:(Maybe ^Cell)
        ret_forward_amount:(VarUInteger 16)
        ret_forward_payload:(Maybe ^Cell)
    ]  
= ContractMessages;