Router

router

Description

This contract implements the router and does the management of the pools. Due to the distributed nature of the TON Blockchain router, it can't do many checks, so it's mostly the proxy for the calls. The router contract so far is used as an owner of all the wallets holding the funds invested by liquidity providers.

The main idea is that if malformed or corrupted data is sent to the router it would create a malformed address of the pool and the message sent to it would fail. So if the message reaches the pool it means some criteria are satisfied.

Data Storage

Index
Type
Size (b/r)
Cell
Name
Description

1

addr

267 / 0

1

router::admin_address

Admin address.

2

addr

267 / 0

1

router::pool_admin_address

Admin address.

3

addr

267 / 0

1

router::pool_factory_address

PoolFactory address. Only this address and admin can create new pools

4

uint64

64 / 0

1

router::flags

Flags that control some router features

5

uint64

64 / 0

1

router::pool_seqno

Number of pools created. Used by indexer to ensure that none of pools are skipped

6

code

0 / 1

11

router::poolv3_code

The cell with the code of the pool, that is needed to create a pool contract

7

code

0 / 1

11

router::accountv3_code

The cell with the code of the account, that is needed to create initial data for pool contract

8

code

0 / 1

11

router::position_nftv3_code

The cell with the code of the user NFT position, that is needed to create initial data for pool contract

9

cell

0 / 1

1

router::timelocked_updates

This cell holds 3 maybe_refs to cells with timelock data for changeable structures

Cells

Name
Size
Free

1

929

94

11

0

1023

Interface

getRouterState

(slice, slice, slice, int, int) getRouterState ()

returns router admin address

Return Values

#
Type
Description

0

slice

router admin address (router::admin_address)

1

slice

default value for pool admin (router::pool_admin_address)

2

slice

pool factory address (router::pool_factory_address)

3

int

currently active flags ( 0 for working and active router)

4

int

router internal number of pool creation or reinit messages

getPoolAddress

(slice) getPoolAddress (slice jetton_wallet0, slice jetton_wallet1)

returns pool address for two given jetton_wallets belonging to the router

Parameters

#
Type
Name
Description

0

slice

jetton_wallet0

Address of the jetton 0 wallet belonging to router

1

slice

jetton_wallet1

Address of the jetton 1 wallet belonging to router

Return Values

#
Type
Description

0

slice

pool address

getChildContracts

(cell, cell, cell) getChildContracts ()

returns code of the child contracts

Return Values

#
Type
Description

0

cell

code of the pool contract

1

cell

code of the account contract

2

cell

code of the nft position contract

Messages

JETTON_TRANSFER_NOTIFICATION

Opcode : 0x7362d09c

Process router funding, payload determines if it is mint or swap

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

jetton_amount

Coins(124)

Amount of coins sent to the router

from_user

Address(267)

User that originated the transfer

forward_payload

Cell(0),Either, Payload

Payload for processing

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for JETTON_TRANSFER_NOTIFICATION
JETTON_TRANSFER_NOTIFICATION#7362d09c 
    query_id:uint64
    jetton_amount:(VarUInteger 16)
    from_user:MsgAddress
    forward_payload:(Either ^Cell Cell)
= ContractMessages;

ROUTERV3_CREATE_POOL

Opcode : 0x2e3034ef

Operation that deploys and inits new Pool contract for two given jettons identified by their wallets. New pool would reorder the jettons to match the invariant slice_hash(jetton0_address) > slice_hash(jetton1_address).

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

jetton_wallet0

Address(267)

Address of the jetton0 wallet. Used to compute pool address

jetton_wallet1

Address(267)

Address of the jetton1 wallet. Used to compute pool address

tick_spacing

Int(24)

Tick spacing to be used in the pool

initial_priceX96

Uint(160),PriceX96

Initial price for the pool

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

Cell(0) 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

0

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

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for ROUTERV3_CREATE_POOL
ROUTERV3_CREATE_POOL#2e3034ef 
    query_id:uint64
    jetton_wallet0:MsgAddress
    jetton_wallet1:MsgAddress
    tick_spacing:int24
    initial_priceX96:uint160
    protocol_fee:uint16
    lp_fee_base:uint16
    lp_fee_current:uint16
    nftv3_content:Cell
    nftv3item_content:Cell
    minter_cell:^[
        jetton0_minter:MsgAddress
        jetton1_minter:MsgAddress
        controller_addr:MsgAddress
    ]  
= ContractMessages;

ROUTERV3_PAY_TO

Opcode : 0xa1daa96d

This is not a message Op this is a payload format for JETTON_TRANSFER_NOTIFICATION

Path
Mnemonic
Type
Description

op

Uint(32),op

query_id

Uint(64)

queryid as of the TON documentation

reciever0

Address(267)

Address of the first reciever of the funds

reciever1

Address(267)

Address of the second reciever of the funds

exit_code

Uint(32)

queryid as of the TON documentation

seqno

Uint(64),Indexer

queryid as of the TON documentation

0

Maybe Cell(1) coinsinfo_cell

Cell with info about the coins

0

amount0

Coins(124)

Amount of coins to be payed to reciever0

0

jetton0_address

Address(267)

Jetton to be sent to reciever0 identified by the wallet that belongs to router

0

amount1

Coins(124)

Amount of coins to be payed to reciever1

0

jetton1_address

Address(267)

Jetton to be sent to reciever1 identified by the wallet that belongs to router

Predicate

exit_code = 200

1

Maybe Cell(1) indexer_swap_info_cell

Information for indexer to process after the swap

1

liquidity

Uint(128),Indexer

Post-swap concentrated liquidity at current tick

1

price_sqrt

Uint(160),Indexer,PriceX96

Post-swap square root of the price stored as fixed point 64.96

1

tick

Int(24),Indexer

Post-swap current tick

1

feeGrowthGlobal0X128

Int(256),Indexer

Current range fee per unit of the liquidity for jetton0

1

feeGrowthGlobal1X128

Int(256),Indexer

Current range fee per unit of the liquidity for jetton1

Predicate

exit_code = 201

2

Maybe Cell(1) indexer_burn_info_cell

Information for indexer to process after the burn

2

nftIndex

Uint(64),Indexer

Nft index that is burned

2

liquidityBurned

Uint(128),Indexer

Amount of liquidity burned

2

tickLower

Int(24),Indexer

Lower tick of the range in which liquidity was burned

2

tickUpper

Int(24),Indexer

Upper tick of the range in which liquidity was burned

2

tick

Int(24),Indexer

Post-burn current tick

TL-B Description (TBD)

This is a preliminary tl-b - subject to change

Tlb for ROUTERV3_PAY_TO
ROUTERV3_PAY_TO#a1daa96d 
    query_id:uint64
    reciever0:MsgAddress
    reciever1:MsgAddress
    exit_code:uint32
    seqno:uint64
    coinsinfo_cell:(Maybe ^[
        amount0:(VarUInteger 16)
        jetton0_address:MsgAddress
        amount1:(VarUInteger 16)
        jetton1_address:MsgAddress
    ] ) 
    (exit_code = 200)?(
        indexer_swap_info_cell:(Maybe ^[
            liquidity:uint128
            price_sqrt:uint160
            tick:int24
            feeGrowthGlobal0X128:int256
            feeGrowthGlobal1X128:int256
        ] ) 
    )
    (exit_code = 201)?(
        indexer_burn_info_cell:(Maybe ^[
            nftIndex:uint64
            liquidityBurned:uint128
            tickLower:int24
            tickUpper:int24
            tick:int24
        ] ) 
    )
= ContractMessages;

ROUTERV3_RESET_GAS

Opcode : 0x42a0fb43

This operation allows router owners the gas if too much accumulated on the contract Access Rights: This operation is allowed for router::admin_address

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 ROUTERV3_RESET_GAS
ROUTERV3_RESET_GAS#42a0fb43 
    query_id:uint64
= ContractMessages;