剧本 SDK
类型脚本 SDK 行动a 关于索拉纳的选项:WebSocket RFQ 为接客、制造商和金库操作员服务的客户,订单签名,检查服务签名 交易、 HTTP 读取和索拉纳指令构建器.
版本 0.4.x 说 WS 协议 1.0.0。阅读 更改日志 在此之前
升级.
安装
npm install @acta-markets/ts-sdk
一揽子船舶无害环境管理和共同JS建设.
| 导入 | 目录 |
|---|---|
@acta-markets/ts-sdk/ws | WebSocket 客户端、 钱包认证、 引文建筑、 选中的接受者签名 |
@acta-markets/ts-sdk/chain | 账户获取器、 PDA 、 订单预览、 指令构建器、 保险库规划器 |
@acta-markets/ts-sdk/http | 地点、信使、市场和金库 |
@acta-markets/ts-sdk/ws/keypair | KeypairAuthProvider 节点 |
@acta-markets/ts-sdk/types | 共享类型 |
浏览器应用程序应导入 /ws它不装入链式客户端或IDL.
取用者: 请求引用
import {
ActaWsClient,
ALL_MINTS,
ALL_POSITIONS,
DEVNET_WS,
WalletAuthProvider,
type WalletLike,
} from "@acta-markets/ts-sdk/ws";
import type { Address } from "@solana/kit";
export function connectTaker(wallet: WalletLike, market: Address) {
const client = new ActaWsClient({
url: DEVNET_WS,
role: "taker",
onDisconnect: "keep_quotes",
products: ["covered_call", "cash_secured_put", "call_spread", "put_spread", "cash_put"],
clientName: "my-app",
clientVersion: "1.0.0",
});
client.on("error", console.error);
client.on("quoteReceived", (quote) => console.log(quote.maker, quote.price));
client.on("authenticated", () => {
client.getMarketDescriptors();
client.getPositions(ALL_POSITIONS);
client.subscribe(["chain_events"], ALL_MINTS);
});
client.on("marketDescriptors", async () => {
await client.createRfq({
market,
terms: { type: "cash_secured_put", strike: 136_000_000_000 },
side: "sell",
quantity: 20_000_000,
timeoutSeconds: 30,
requestId: crypto.randomUUID(),
});
});
client.connectAndAuthenticate(new WalletAuthProvider(wallet));
return client;
}
url 是 API 来源; 客户端附件 /taker, (中文(简体) ), /maker, (中文(简体) ), /maker/data 或者说 /vault。 。 。 .
DEVNET_WS 财务报告和审定财务报表 MAINNET_WS 导出。 连接和等待前的注册处理器
页:1 authenticated 在交易之前. createRfq 需要市场描述符,所以等待
marketDescriptors 先说.
price 财务报告和审定财务报表 strike 是每个基础单位的1e9固定点值. quantity 进入
内薄膜原子. createRfq, (中文(简体) ), acceptQuote 财务报告和审定财务报表 submitSignedSponsoredTx 页:1
当服务器接受命令时,而不是交易降落时.
之后 acceptQuote(rfqId, maker, orderIdHex),服务器发送 sponsoredTxToSign签名
仅与 verifyAndSignTakerFill,用于重建预期填充并拒绝
其他的任何东西。 将已接受的命令ID保存在重新连接之间; 超时或超时后 unknown
发送,呼叫 getOrderStatus(orderIdHex) 重试之前。 这个
网络客户端指南 拥有
完全签名和恢复流.
购买选项
买家用 side: "buy" (原始内容存档于2017-09-31). In the RFQ. 制作者从其制作者 PDA 中写入选项
因此,只有制造商同意 taker_buy_rfqs 有足够的监护权,见RFQ。 一个金库
其代表持有 SIGN_WRITER_QUOTES 也引用其附带腿部的购买和写作.
最好的购买报价是最低价格。 如果没有制作者能够收到RFQ,服务器会关闭它
随心所欲 no_eligible_makers 而不是等待暂停.
await client.createRfq({
market,
terms: { type: "covered_call", strike: 150_000_000_000 },
side: "buy",
quantity: 10_000_000,
timeoutSeconds: 30,
requestId: crypto.randomUUID(),
});
接受并签署 确切的销售: verifyAndSignTakerFill 从 RFQ 读取侧面
并拒绝填充,其侧面、条款或数额不尽相同。 买方支付下列费用的总保险费:
引出薄荷并成为位置 holder; 制造者或金库是 writer为 a
保险库引文通过解码金库为 makerVault:买方随后检查已发货
OpenPositionForVaultWriter 持单字节1,其中买方的钱包为签注人和
金库代表只签了身份证.
实物购买(covered_call, (中文(简体) ), cash_secured_put)通过交存
严格提前结算金额 expiryTs;程序拒绝以后的存款:
import { fetchMarket, fetchPosition } from "@acta-markets/ts-sdk";
import { flows } from "@acta-markets/ts-sdk/chain";
const { ixs } = await flows.buildDepositFundsIxs({
programId,
payer: buyer.address,
owner: buyer,
position: (await fetchPosition(rpc, positionPda)).data,
market: (await fetchMarket(rpc, marketPda)).data,
});
分期付款和现金都不用押金和现金结算。 情况是结果已到
state数字 :
settled与settlement.typephysical(存款,或出钱),cash(单位:千美元)holder_payoff是你们的),或not_exercised(在无存款的货币中:全部) 附带返回给作者).terminal_pending { slot, outcome }: 链已确定位置和服务器 还没有封住那个位置。 显示它,但不要数它.
制作者:引用一个RFQ
import {
ActaWsClient,
buildSignedQuoteFromRfq,
generateNonce,
MAINNET_WS,
type AuthProvider,
type RfqBroadcastMessage,
} from "@acta-markets/ts-sdk/ws";
import type { SignerLike } from "@acta-markets/ts-sdk/chain";
import type { Address } from "@solana/kit";
export function runMaker(
auth: AuthProvider,
makerOwner: Address,
makerSigner: SignerLike,
priceFor: (rfq: RfqBroadcastMessage) => number,
) {
const quotes = new ActaWsClient({
url: MAINNET_WS,
role: "maker",
onDisconnect: "cancel_quotes",
products: ["covered_call", "cash_secured_put"],
clientName: "my-maker",
clientVersion: "1.0.0",
});
let timing = { minValidity: 0, buffer: 0, clockOffsetMs: 0 };
quotes.on("welcome", (welcome) => {
timing = {
minValidity: welcome.min_quote_validity_seconds,
buffer: welcome.settlement_buffer_seconds,
clockOffsetMs: welcome.server_time_unix_ms - Date.now(),
};
});
quotes.on("rfqBroadcast", async (rfq) => {
const now = Math.floor((Date.now() + timing.clockOffsetMs) / 1000);
const validUntil = Math.max(
now + timing.minValidity,
rfq.expires_at + Math.max(timing.minValidity, timing.buffer),
);
if (validUntil > rfq.market.expiry_ts) return;
const quote = await buildSignedQuoteFromRfq({
rfq,
terms: rfq.order_options[0],
price: priceFor(rfq),
validUntil,
nonce: generateNonce(),
makerOwner,
makerSigner,
});
quotes.submitQuote(quote);
});
quotes.connectAndAuthenticate(auth);
return quotes;
}
仅引用下列术语: rfq.order_options。 。 。 . buildSignedQuoteFromRfq 检查术语
和整数范围,而不是地点时间。 引文必须在RFQ过期后有效
大于 min_quote_validity_seconds 财务报告和审定财务报表 settlement_buffer_seconds 从 Welcome。使用第二个客户端 makerEndpoint: "data" 读取
和所有者推动positionUpdated, (中文(简体) ), makerCapsUpdated, (中文(简体) ), tradeExecuted所以,引语
套接字仅引用 。 这个 创建者 API 引用
覆盖引文生命周期.
HTTP 读取
import { ActaHttpClient } from "@acta-markets/ts-sdk/http";
import { MAINNET_API } from "@acta-markets/ts-sdk/ws";
const http = new ActaHttpClient({ baseUrl: MAINNET_API });
const [venue, tokens, markets, vaults] = await Promise.all([
http.venue(new AbortController().signal),
http.tokens(),
http.markets({ active: true }),
http.vaults(),
]);
tokens() 返回 a Map 由薄荷键入. 答复以ETags重新验证.
链条
/chain 导出账户获取器、 PDA 帮助器、 命令预览和签名、 生成
指令构建者,以及 flows数字 :
flows.buildOpenPositionFlowIxs财务报告和审定财务报表buildOpenSpreadFlowIxs返回制造器 Ed25519 核查和开放指示.flows.buildDepositFundsIxs(a) 开户情况 在此之前expiryTs。 。 。 .buildSettlePositionIx解决物理选项并展开。 无资金购买者 返回所有附带物给编剧,同样在 ITM 时.flows.VaultManagerPlanner建立金库资本、交易、扩展、交换和治理 说明.trading.openPositionAsWriter财务报告和审定财务报表spreads.openSpreadAsWriter出售给a 制造器( 持有字节 );openPositionForWalletHolder财务报告和审定财务报表openSpreadForWalletHolder构建 打开钱包从金库购买(持有者字节1).decodeActaEventData(root导出)读取事件版本 2: 1PositionOpened每个开放(作家、持有者、,flags,条件,毛和净溢价,抵押品)和1VaultCycleOpened每个金库侧. 升级返回前的版本 1 事件null。 。 。 .
默认操作员连接到 role: "vault" (单位:千美元) vaultPda。签名
只与交易 verifyAndSignSponsoredTx 财务报告和审定财务报表 verifyAndSignSwap 从 /ws他们
仅签署预期意图的精确匹配并投出 flows.VaultIntentError
(从 /chain否则.
需要有意识的铸造者 rpc - 托肯-2022薄荷需要它们的
实际符号程序。 传出 a programId 当您不使用默认程序时,每个流量.
这个 保险库操作指南
包括金库会议、服务交换和中场演出.
迁移到0.4.2
需要金库写入程序升级 。 Opcode,账户布局和种子不变.
| 0.4.1 (中文(简体) ) | 0.4.2 (中文(简体) ) |
|---|---|
OpenPositionForVaultAsTaker, (中文(简体) ), OpenSpreadForVaultAsTaker | OpenPositionForVaultWriter, (中文(简体) ), OpenSpreadForVaultWriter附加时 holderKind |
OpenPositionForVaultAsMaker, (中文(简体) ), OpenSpreadForVaultAsMaker | OpenPositionForVaultHolder, (中文(简体) ), OpenSpreadForVaultHolder |
VaultFundMakerPosition, (中文(简体) ), fundMakerPosition | FundPositionForVaultHolder, (中文(简体) ), fundHolderPosition |
openPositionAsTaker, (中文(简体) ), openSpreadAsTaker | openPositionAsWriter, (中文(简体) ), openSpreadAsWriter |
openPositionAsMaker, (中文(简体) ), openSpreadAsMaker | openPositionAsHolder, (中文(简体) ), openSpreadAsHolder |
保险库写入槽 actor, (中文(简体) ), maker, (中文(简体) ), makerCustodyAta | participant, (中文(简体) ), counterparty, (中文(简体) ), premiumSource |
保险库持有人插槽 taker, (中文(简体) ), takerUnderlyingAta, (中文(简体) ), takerQuoteAta | writer, (中文(简体) ), writerUnderlyingAta, (中文(简体) ), writerQuoteAta |
OpenPosition 插槽 user, (中文(简体) ), userUnderlyingAta, (中文(简体) ), userQuoteAta | taker, (中文(简体) ), writerUnderlyingAta, (中文(简体) ), takerQuoteAta |
存款 makerPda; 制造商传输 makerOwnerPremiumAta | holderMakerPda· ; makerOwnerAta |
OPEN_TAKER, (中文(简体) ), SIGN_MAKER_QUOTES, (中文(简体) ), FUND_MAKER | OPEN_AS_WRITER, (中文(简体) ), SIGN_HOLDER_QUOTES, (中文(简体) ), FUND_HOLDER; 新建 SIGN_WRITER_QUOTES |
事件 OpenPosition, (中文(简体) ), OpenSpread, (中文(简体) ), OpenTakerBuy, (中文(简体) ), OpenTakerBuySpread | PositionOpened |
事件 VaultPositionOpened, (中文(简体) ), VaultSpreadOpened | VaultCycleOpened |
VaultMakerPositionFunded· ; TakerBuyFunded.user | VaultHolderPositionFunded· ; TakerBuyFunded.holder |
存款中持有者不匹配 : MakerNotOwner | NotPositionHolder (1111号) |
迁移到0.4.0
职位角色是: writer 财务报告和审定财务报表 holder页:1.
| 0.3.x (单位:千美元) | 0.4.0 (中文(简体) ) |
|---|---|
Position.takerOwner, (中文(简体) ), makerOwner | writer, (中文(简体) ), holder |
POSITION_OFFSET_TAKER_OWNER, (中文(简体) ), _MAKER_OWNER | POSITION_OFFSET_WRITER, (中文(简体) ), _HOLDER |
存款 makerOwner, (中文(简体) ), makerFundingAta | holder, (中文(简体) ), holderFundingAta |
结算和清算 userDestAta, (中文(简体) ), makerDestAta | writerDestAta, (中文(简体) ), holderDestAta |
事件 user, (中文(简体) ), makerOwner, (中文(简体) ), taker | holder, (中文(简体) ), writer |
makerPayoff, (中文(简体) ), takerReturn; WS 键 maker_payoff, (中文(简体) ), taker_return | holderPayoff, (中文(简体) ), writerReturn· ; holder_payoff, (中文(简体) ), writer_return |
fetchPositionsByMaker, (中文(简体) ), ByTaker | fetchPositionsByHolder, (中文(简体) ), ByWriter |
buildDepositPremiumIx, (中文(简体) ), DepositPremium | buildMakerDepositIx, (中文(简体) ), MakerDeposit |
见 变化 完整名单.
恢复
客户端重新连接并恢复订阅. 与 autoReconcile,默认,它
然后重新读取你的RFQ和位置。 无法读取的框架不会删除会话 :
你会得到 unknownMessage 或一个 invalid_frame 错误, 最多读一次
每5秒,因为被跳过的框架可能带有填充或位置变化.
列表呼号
列表方法为您收集每一页 fetchAllPages。用于“再装入”视图
使用页面方法,例如 getPositionsPageAsync,或将页面查询传递给 HTTP
历史方法,并将返回的光标作为不透明的值.
在电线上,WS列表 limit (最多200个)和标签 cursor返回时
next_cursor, (中文(简体) ), null 在最后一页。 REST 列表选择 limit (违约50,
最多200个,100个金库申请)和可选 cursor: 为第一个省略
页面,然后通过 next_cursor 就是这样 见
呼叫合同。 。 。 .
文档
许可证
麻省理工学院