Lighter
zk rollup上的永续合约DEX,以USDC计价和结算。交易所对象连接Lighter的永续合约:下单、改单、撤单和设置杠杆都是用API密钥私钥签名的L2交易,查询挂单、历史订单要用同一把私钥生成的鉴权令牌。接入前需要在Lighter创建API密钥,并记下API密钥索引与账户索引。
名称与配置
exchange.GetName():Futures_Lighter(期货);别名:zkLighter。
| 配置项 | 必填 | 默认值 | 说明 |
|---|---|---|---|
| API密钥私钥 | 是 | — | 在Lighter创建的API密钥私钥(40字节十六进制,可带0x前缀),用于签名L2交易和生成鉴权令牌。 |
| API密钥索引 | 是 | — | API密钥的索引号,范围3-254(0-2为系统保留) |
| 账户索引 | 是 | — | Lighter账户索引,用于标识主账户或子账户 |
| 模拟盘 | 否 | 不勾选 | 勾选后连接Lighter测试网。 |
交易对与合约代码
交易对示例:BTC_USDC、ETH_USDC
只有USDC计价的永续合约,交易对写作BTC_USDC,完整代码形如BTC_USDC.swap,其它计价币报错。交易对不区分大小写,返回数据中统一为大写。
| 合约代码 | 说明 |
|---|---|
swap | USDC永续合约(唯一的合约类型)。 |
Lighter只有永续合约,swap以外的合约代码会报错。
专属IO指令
| 指令 | 参数 | 说明 | 返回值 |
|---|---|---|---|
cross | bool[, symbol] | 全仓(true)/逐仓(false),不传symbol时作用于当前合约。(详见表下) | {symbol, leverage, marginMode, initialMarginFraction, txHash, ok},txHash为这笔链上交易的哈希。 |
expiry | number | 之后所下限价单和条件单的存活时长(毫秒,必须大于0),默认29天(交易所允许的上限);订单的过期时间为下单时刻加10分钟再加该时长。市价单不受影响。 | true |
api | method, path[, params[, raw[, sign]]] | 直接调用Lighter接口,只支持GET、POST。(详见表下) | 交易所的原始应答;应答code不是200时报错。 |
表中长说明的其余部分:
cross:Lighter的保证金模式与杠杆在同一笔链上交易里设置,这笔交易同时写入该品种当前的杠杆(先读交易所账户数据中该品种的设置;本次运行60秒内刚设置过的以刚设置的为准;都没有时取该市场的缺省杠杆)。api:默认附带用API密钥私钥生成的鉴权令牌(需要填写私钥与账户索引);sign传false(也可以直接作为第4个参数)时不带令牌,只能用于公开GET接口。raw不是请求体而是参数表(JSON对象或a=1&b=2),非空时整体替换params;GET编入查询串,POST编成表单。不会替调用方签名L2交易。
通用指令base、currency见exchange.IO。
常用用法
设置限价单的存活时长
javascript
function main() {
// 之后的限价单与条件单在下单时刻加10分钟、再加1小时后过期(默认29天);市价单不受影响
exchange.IO("expiry", 60 * 60 * 1000)
var id = exchange.CreateOrder("ETH_USDC.swap", "buy", 2000, 0.01)
Log("订单ID:", id)
}
用api调用公开接口与带鉴权令牌的账户接口
javascript
function main() {
// 公开接口:第4个参数传false,不带鉴权令牌
var books = exchange.IO("api", "GET", "/api/v1/orderBooks", {}, false)
Log("市场数:", books.order_books.length)
var d = exchange.IO("api", "GET", "/api/v1/orderBookDetails", {market_id: 0}, false)
Log(d.order_book_details[0].symbol, "最新价:", d.order_book_details[0].last_trade_price)
// 账户接口默认带鉴权令牌;账户索引可以从GetAccount()的Info中取
var idx = exchange.GetAccount().Info.account_index
var params = {account_index: idx, market_id: 0}
var r = exchange.IO("api", "GET", "/api/v1/accountActiveOrders", params)
Log("market_id为0的市场挂单数:", r.orders.length)
}
函数支持差异
没有不支持的标准函数。
以回退方式支持:
exchange.GetRecords:原生周期为1分钟、5分钟、15分钟、30分钟、1小时、4小时、12小时、1天、1周;其它周期由托管者合成。
保证金、账户与模拟盘
保证金模式:用exchange.IO("cross", bool)按合约切换全仓/逐仓,用exchange.SetMarginLevel()设置杠杆。两者在Lighter是同一笔链上交易(UpdateLeverage),每次调用都会发出一笔交易,并且总是同时写入杠杆和保证金模式,另一项保持该品种当前的值:exchange.SetMarginLevel()保留当前保证金模式,exchange.IO("cross", ...)保留当前杠杆。当前值读取交易所账户数据中该品种的设置(没有持仓的品种也有);本次运行60秒内刚设置过的以刚设置的为准(交易所数据更新有延迟);都没有时为该市场的缺省杠杆、全仓。exchange.SetMarginLevel()也可在附加参数中传{marginMode: "isolated"}(或cross)同时指定保证金模式。持仓的MarginLevel由交易所持仓数据中的初始保证金率换算。
持仓模式:单向(净)持仓,不支持双向持仓。
账户:「账户索引」决定交易的是主账户还是子账户;账户和持仓按账户索引查询,资产只有USDC一种。
模拟盘:勾选「模拟盘」连接Lighter测试网(https://testnet.zklighter.elliot.ai)。也可以用exchange.SetBase()(或exchange.IO("base", url))切换接口地址:地址中含testnet时按测试网签名,否则按主网签名。
注意事项
| 函数 | Futures_Lighter的行为 |
|---|---|
| exchange.GetTicker() | 买一、卖一取自盘口;交易所行情不带时间戳,Time为本地时间 |
| exchange.GetTickers() | Buy、Sell是各品种的最新成交价(交易所没有批量盘口接口);需要买一、卖一价时用exchange.GetTicker()或exchange.GetDepth()。最新价、24小时最高最低价和成交量都为0的占位品种不返回 |
| exchange.GetDepth() | 交易所返回逐笔挂单,每笔挂单单独成一档、不按价格合并,同一价格可能出现多档 |
| exchange.GetFundings() | Rate为交易所费率除以8(每小时费率),Interval为1小时,Time为下一个整点 |
| exchange.CreateOrder() | 限价单支持GTC(按exchange.IO("expiry", ...)的存活时长挂单)、IOC和只做Maker,不支持FOK。市价单是以下单时对手一价±滑点为最差成交价的IOC单(买单不高于卖一×(1+滑点),卖单不低于买一×(1−滑点)),滑点默认0.5%,可用下单附加参数slippage调整(如0.01,大于0且小于1,与市价条件单同一参数);这个价格以内的挂单不足时剩余部分撤销。一点都没有成交时订单为已撤销、DealAmount为0,Info中的status为撤销原因(如canceled-too-much-slippage) |
| exchange.CreateConditionOrder() | 只支持止盈、止损,不支持OCO。带委托价时为限价条件单;委托价为-1(市价)时触发后按市价成交(IOC),最差成交价为触发价±5%(买单上浮、卖单下浮),可在附加参数中用{slippage: 0.1}调整 |
| exchange.ModifyOrder() | 原地改单,订单ID不变;不传的价格或数量沿用原值 |
| exchange.GetOrders()、exchange.GetConditionOrders() | 交易所接口必须指定品种:不传或传空字符串时只查当前品种。GetOrders只返回限价、市价单,GetConditionOrders只返回止盈止损单(TWAP等其它类型不出现在两者中);不支持USDC.swap这类范围参数 |
| exchange.GetOrder() | 只在挂单和该品种最近100条历史订单中查找,更早的订单返回空值 |
| exchange.ModifyConditionOrder() | 原地修改数量、触发价和委托价,订单ID不变。不能改变限价/市价类型:限价条件单传委托价-1、市价条件单传正数委托价时报错,需要撤销后重新创建;市价条件单的最差成交价按新的触发价重新计算 |
| exchange.GetHistoryOrders()、exchange.GetHistoryConditionOrders() | 交易所接口必须指定品种:不传时查当前品种,传空字符串或范围报错;不支持since参数,传入时报错;不传limit时分别返回最近100条、500条 |