- Go to https://testnet.app.lighter.xyz/ and connect a wallet to receive $500
- run
system_setup.pywith the correct ETH Private key configured- set an API key index which is not 0, so you won't override the one used by app.lighter.xyz
- this will require you to enter your Ethereum private key
- the eth private key will only be used in the Py SDK to sign a message
- the eth private key is not required in order to trade on the platform
- the eth private key is not passed to the binary
- the API key config is saved in a local file
./api_key_config.json
-
create_modify_cancel_order_http.py- creates an ask (sell) order for 0.1 ETH @ $4050
- modified the order and increases the size to 0.11 ETH and increases the price to $4100
- cancels the order
- Note: all of these operations use the client order index of the order. You can use the order from the exchange as well
-
create_modify_cancel_order_ws.py- same flow as
create_modify_cancel_order_http.py - sends TXs over WS instead of HTTP
- same flow as
-
create_market_order_eth_buy.py- creates a market buy order for 0.1 ETH @ market price
-
create_market_order_eth_sell.py- creates a market sell order for 0.1 ETH @ market price
-
create_grouped_ioc_with_attached_sl_tp.py- creates an ask (sell) IoC order for 0.1 ETH
- along w/ the order, it sets up a Stop Loss (SL) and a Take Profit (TP) order for the whole size of the order
- the size of the SL/TP will be equal to the executed size of the order
- the SL/TP orders are canceled when the sign of your position changes
-
create_position_tied_sl_tp.py- creates a bid (buy) Stop Loss (SL) and a Take Profit (TP) to close your short position
- the size of the orders will be for your whole position (because BaseAmount=0)
- the orders will grow / shrink as you accumulate more position
- the SL/TP orders are canceled when the sign of your position changes
SL/TP orders need to be configured beyond just setting the trigger price. When the trigger price is set,
the order will just be executed, like a normal order. This means that a market order, for example, might not have enough slippage!
Let's say that you have a 1 BTC long position, and the current price is $110'000.
You want to set up a take profit at $120'000
- order should be an ask (sell) order, to close your position
- the trigger price should be $120'000
What about the order types? Just as normal orders, SL/TP orders trigger an order, which can be:
- market order
- limit IOC / GTC
margin_eth_20x_cross_http- sets ETH market to 20x leverage and cross-margin mode, using HTTP
margin_eth_50x_isolate_ws- sets ETH market to 50x leverage and isolated margin mode, using HTTP
margin_eth_add_collateral_http.py- adds $10.5 USDC to the ETH position (must be opened and in isolated mode)
margin_eth_remove_collateral_ws.py- removes $5 USDC from the ETH position (must be opened and in isolated mode)
send_batch_tx_http.py- sends multiple orders in a single HTTP request
send_batch_tx_ws.py- sends multiple orders in a single WS request`
Batch TXs will be executed back to back, without the possibility of other TXs interfering.
To trade spot markets, you need to have spot USDC. USDC used in your perpetual account will be used as collateral for your cross-positions.
USDC deposited in the spot account can only be used to buy spot assets.
To transfer USDC between spot <> perp balance, or vice verse, check out
spot_self_transfer_perp_spot.pyspot_self_transfer_spot_perp.py
Order placement / trades work in the same way as for perpetual markets.
The fee will be paid in the received asset for premium spot trades.
This means that if you sell ETH, you'll receive less USDC, and if you BUY 1 ETH, you'll receive slightly less than 1 ETH.
You can check out the following examples, which should work on spot ETH by changing the market index to 2048 instead of 0.
create_modify_cancel_order_http.pycreate_modify_cancel_order_ws.pycreate_market_order_eth_buy.pycreate_market_order_eth_sell.pysend_batch_tx_http.pysend_batch_tx_ws.py
Trading setup is very similar to perpetual markets.
The only difference is that you'll need to hold USDC / ETH before placing an order.
For example, on perp markets you can place an order to short (sell) ETH without having to worry that much.
The limitation there would be to have enough available collateral to cover the order.
On spot orders, you need to have enough assets in your spot account to cover all open orders.
If you want to place two orders, to buy 1000 USDC worth of ETH and 1000 USDC worth of ZK, you'll need to have at least 2000 available USDC.
You can get the order book details (including symbol and market index) as well as quote asset id (ETH) and base asset id (USDC)
by following the example below:
spot_get_order_books.py
Note: you'll need the quote asset id and base asset id to check available balance.
Available balance is not locked in open orders.
To keep track of your spot balance, you can use HTTP calls or a websocket subscription.
Examples on how to do this can be found here:
spot_get_account_assets_http.pyspot_get_account_assets_ws.py
Moving money to / from subaccounts is possible for spot assets. For USDC, you can move directly from main perp balance to subaccount spot balance, for example. More details can be found in the following example:
sub_account_create.pysub_account_transfer_eth.pysub_account_transfer_usdc.py
Public pools behave just like subaccounts, except that anyone can join them.
You can create / modify a public pool using the SDK. Check out the following example:
public_pool_create_modify.py
To create API keys for a public pool, you need to run the setup script but specify the ACCOUNT_INDEX to be the one of the public pool.
After that, you can trade from the public as from any other account.
If you want to deposit / withdraw from a public pool, check the following example:
public_pool_deposit.pypublic_pool_withdraw.py
To get information about pools, check:
public_pool_info.py
withdraw_fast.py- send USDC directly from Lighter to Arbitrum
withdraw_normal.py- send USDC/ETH from Lighter to Ethereum
transfer.py- generic example of how to transfer funds between accounts.
- same functionality as
sub_account_transfer_ethandsub_account_transfer_usdc
The memo field is a user message, and it has to be exactly 32 bytes long. In case of fast withdrawals, you need to specify the recipient in the memo.
This is the case since the memo is part of the signature. This way, the recipient is verified.
When calling client.transfer, you pass the amount without needing to worry about the decimals.
When calling client.sign_transfer on the other hand, you need to specify the decimals and pass an integer.
The fee field can be obtained by calling info_api.transfer_fee_info(...). The field can be passed as it is.
Transfers between subaccounts are free for all assets.
When sending assets, you can specify the source and destination routes.
A route is either perp or spot. You can send USDC directly from your perp balance to another person's spot balance.
If you receive USDC in your perp account, it will be instantly used as collateral for open positions.
This also allows you to move USDC from your spot balance to your perp balance.
Spot assets (like ETH) need to have both the from and to route set to spot.
You can get all asset_ids by following the example below:
spot_get_order_books.py
- deposit money on Lighter to create an account first
- change the URL to
mainnet.zklighter.elliot.ai - repeat setup step