@bskts/ sdk (英语)
键入, 非拘禁 客户端 bskts API (英语::有象征意义的指数篮子"Stock Tokens"和"Robinhood链"(chainId 4663)上的密码.
- 读取:活NAV,24h更改并购买每个篮子的成本,钱包余额,有PnL的位置,开放订单,NAV历史或只是它的总结,以及现在可以执行的每一个公共工作.
- 未签署的计划数字 :
build*方法返回{ approval, tx, simulation }你用自己的钱包通过viem签名。 SDK从不持有钥匙或资金. - 代理默认安全API将每个计划作为你的地址
execute()拒绝返回; 可选policy在构建任何设备之前,上限为交易大小、篮子、成本和滑行;错误带一个平稳code。 。 。 . - 从 Zod 计划键入:每个响应在运行时被验证. 链上金额
bigint,地址和呼叫数据viem'sAddress编号 :Hex。 。 。 .
pnpm add @bskts/sdk viem
只有无害环境管理,节点20.19+,浏览器,工人,德诺和邦. viem 是同级依赖.
循环
import { BsktsClient, robinhood, viemSender } from "@bskts/sdk";
import { createPublicClient, createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`);
const sender = viemSender(
createWalletClient({ account, chain: robinhood, transport: http() }),
createPublicClient({ chain: robinhood, transport: http() }),
);
const me = account.address;
const bskts = new BsktsClient({
policy: { maxUsdPerTrade: 250, allowedTickers: ["DIGI64", "MAG6"], maxBuyCostBps: 50 },
});
// 1. pick
const { markets } = await bskts.markets(); // ticker, nav, change24h, buyCostBps
const { summary } = await bskts.navSummary("DIGI64", { days: 30 });
// 2. check the wallet: USDG to spend, ETH for gas
const wallet = await bskts.wallet(me);
if (!wallet.gasOk) throw new Error(wallet.note);
// 3. buy $100: approval first if needed (waited on), then the buy
await bskts.execute(
await bskts.buildBuy({ ticker: "DIGI64", amountUsdg: 100, address: me }),
sender,
{ wait: true },
);
// 4. hold
const { positions } = await bskts.positions(me); // value, avgEntry, unrealizedPnl, walletSharesWei (bigint)
// 5. sell half, then the rest
await bskts.execute(
await bskts.buildSell({ ticker: "DIGI64", address: me, fraction: 0.5 }),
sender,
{ wait: true },
);
await bskts.execute(await bskts.buildSell({ ticker: "DIGI64", address: me }), sender, {
wait: true,
});
在浏览器中, 将钱包客户端构建在被注入的提供者之上 : createWalletClient({ account, chain: robinhood, transport: custom(window.ethereum) })。对于另一个签名库,请执行 Sender (单位:千美元)send(tx) 财务报告和审定财务报表 wait(hash)) (中文(简体) ).
命令
与 policy.maxBuyCostBps 设定、市场购买和限制购买(钱包和授权) 拒绝高于上限的当前购买成本或未知成本 POLICY。对于休息限制,在下订单时适用这一检查;其链上滑行底线适用于后期填充。 销售、出口和取消不需要估计购买成本.
// stop-loss + take-profit, one cancels the other
await bskts.execute(
await bskts.buildOrder({
kind: "exit",
ticker: "INDEX2",
address: me,
shares: positions[0].walletSharesWei,
stopNav: 92,
tpNav: 112,
}),
sender,
);
// a resting limit buy: fills when the 10-minute average NAV drops to the trigger
await bskts.execute(
await bskts.buildOrder({
kind: "limit",
ticker: "MAG6",
address: me,
amountUsdg: 250,
triggerNav: 98,
}),
sender,
);
// cancel: pass the order's escrow too. Every escrow numbers its orders from 1, so one
// id can be open on several, and without escrow the API refuses with ORDER_AMBIGUOUS
const { orders } = await bskts.orders(me);
const [o] = orders;
await bskts.execute(
await bskts.buildOrder({ kind: "cancel", orderId: o.id, escrow: o.escrow, address: me }),
sender,
);
错误
每一次失败都是 BsktsError 与 code, (中文(简体) ), retryable 财务报告和审定财务报表 detail数字 :
| 代码 | 含义 |
|---|---|
POLICY | 您的客户政策拒绝了; 没有要求或发送 |
SIMULATION_FAILED | aPI的干线还原(detail.reason(三); execute(plan, sender, { force: true }) 无论如何发送 |
INSUFFICIENT_SHARES | 售出超过钱包控件( 必须先取消 ) |
NO_ROUTE | 一个成分现在没有路线: 篮子不能通过API买卖 |
NO_REFERENCE | 该篮子没有限制/退出订单(市场买卖工作) |
ORDER_AMBIGUOUS | 一个取消的 orderId 在一个以上的代管上打开:通过 escrow 从 orders() |
UNKNOWN_BASKET, (中文(简体) ), BAD_REQUEST, (中文(简体) ), ORDER_NOT_OPEN, (中文(简体) ), NOT_FOUND | 修改请求 |
PAUSED, (中文(简体) ), UPSTREAM, (中文(简体) ), SERVER, (中文(简体) ), NETWORK | retryable: true: 稍后再试(除了 NETWORK 从 sessionRelayer: 见 UNCERTAIN(中文(简体) ) |
FEE_REQUIRED | 引用的中继器 detail.requiredFee· ; executeSession 重签您上限内相同的动作 |
RATE_LIMITED | retryable: true: 中继器未发送; 稍后重新提交相同的签名动作 |
REFUSED | 中继器在发送前被拒绝(消息中的理由); retryable 仅用于503年 |
UNCERTAIN | 中继器失败, 并且可能已经发送 : 请先检查动作是否在链上 |
TX_FAILED | 开采和还原(通常市场经过) minShares 编号 : minOut: 重建和重试 |
BAD_RESPONSE | aPI 用这个 SDK 版本不知道的形状回答: 升级 |
单位
amountUsdg纳维亚,value, PnL: 平价美元(number) (中文(简体) ).- 链上数额(
*Wei, (中文(简体) ),shares, (中文(简体) ),minShares, (中文(简体) ),expectedUsdg, (中文(简体) ),minOutUsdg, (中文(简体) ),feeUsdg:bigint(单位:1e18,1e6美元)。 过walletSharesWei回到现在. change24h和NAV摘要:分数(0.012=+1.2%).buyCostBps, (中文(简体) ),slippageBps:基点.
收入费
暂停订单和预定购买 公职数字 : jobs() 现在列出每个可执行文件, 并列出Calldata和它付给谁的收费。 模拟第一;每个填充被按到订单的链地上.
委托代理人(bskts账户)
一次性所有者批准后,对自主交易使用此路径. 直接
钱包 buildBuy/buildSell 计划是不同的路径,需要钱包
签名人和ETH。 一个代理从所有者的账户交易,从来没有
退出,并从USDG账户支付网络费.
- 在主机钱包或安全签名器中创建代理签名密钥 。 只分享 它的公开演讲。 SDK和MCP从不接受私钥.
- 读取
client.agentSession({owner, key})它解决了所有者的账户. 如果不活动, 请将所有者发送给返回的approvalUrl; 在组合中 连接公用钥匙并审查/签署其限制。 用USDG为帐户供资. - 构建
client.buildAgentTrade({owner,key,ticker,side:"buy",amountUsdg:6})或者说{owner,key,ticker,side:"sell",shares}(准确的重力基数单位). - 给
executeSession主机的签名回调和清晰的网络 费用上限。 对每个行业或所有人/代理人的ETH要求,没有业主突然出现.
import { BsktsClient, executeSession, sessionRelayer } from "@bskts/sdk";
import type { SessionSender } from "@bskts/sdk";
// hostSigner is supplied by your secure host wallet, already configured to
// use the agent key. Never embed a private key in source, prompts or MCP calls.
const client = new BsktsClient();
const key = hostSigner.address;
const permission = await client.agentSession({ owner, key });
if (!permission.active) throw new Error("Owner approval required: " + permission.approvalUrl);
const sender: SessionSender = {
key,
sign: (typedData) => hostSigner.signTypedData(typedData),
submit: sessionRelayer(),
};
const plan = await client.buildAgentTrade({
owner,
key,
ticker: "INDEX2",
side: "buy",
amountUsdg: 6,
slippageBps: 50,
});
const receipt = await executeSession(plan, sender, {
maxNetworkFeeUsdg: 250_000n, // host explicitly allows at most $0.25 network fee
});
建议的所有者限额:可动用帐户的10% USDG(至少10美元)上限为每天100美元 营业额 0.5%全入舱滑行,为7天. 核准的美元限额 存款后保持固定。 只有主人可以改变/更新. 一些篮子 需要更多的延迟; 请求所有者批准而不是默默地扩大. 中继器在收费/剪接后需要5美元篮子价值才能购买(因此是5美元现金) 预算可能太小),或者整个销售位置.
会议计划没有签字,所以 simulation.ok 无效。 中继器模拟
在广播前签名的动作。 402号 requiredFee 只重新签名
在东道方的收费限额内,保留同样的非ce、最后期限和贸易条件.
委托计划将其篮子计数器绑入经审查的金库地址
src/agent-vaults.json。客户端拒绝不匹配的API响应,并且
executeSession 签署前再次检查,包括直接提供的计划
或解析后更改。 未知或重新部署的篮子需要升级SDK;
地址绝不会因贸易反应而自动改变。 维护者更新
针从 /v1/baskets 仅与主存储器比较后
犬类 src/lib/contracts.ts,然后将审查过的更改用更改表传送.
executeSession 记得每个篮子最后的每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分每分量,每分每分每分每分每分每分每分每分每分每分每分每分每分每
需要(中继器也引用成功),并用它签下一个,所以
重复交易是一次签名和一次中继器往返。 计划与
feeUsdg 保持这个收费, 而记住的费用高于你的上限是不使用的。 这个
记忆在这个过程中活了6小时;通过 fees: new Map() 或属于自己的
{ get, set } 储存以保存在其他地方(跨越工人或重新启动),或
fees: false 从402引文开始.
SDK会的 没有 自动重试超时: 检查
BsktsSessionModule.nonceUsed(account,nonce) 编辑 Executed 事件发生前
重新报到。 永远不要重建一个可能提交的交易 与一个新的非ce.
对于可以重新启动的进程,请使用 executeSessionOnce (SDK 0.5.0+)和一个
每个逻辑交易的耐用储存。 它保留了未签署的计划 签署前, (中文(简体) ),
保留原始的非ce 跨收费报价,并记录成功的收款.
同时开始只能保留一个计划. 重新开始从不签名或提交
操作:返回记录的结果或调节其非ce.
密钥和签名从未写给这家店.
import { executeSessionOnce, sessionActionState, robinhood } from "@bskts/sdk";
import { fileSessionStore } from "@bskts/sdk/node"; // Node only; no fs in the root SDK
import { createPublicClient, http } from "viem";
const chain = createPublicClient({ chain: robinhood, transport: http("https://bskts.xyz/rpc") });
const result = await executeSessionOnce({
store: fileSessionStore(".bskts-agent/strategy-operation-001.json"),
sender, // same secure host callbacks as above
maxNetworkFeeUsdg: 250_000n,
build: () => client.buildAgentTrade({ owner, key, ticker: "INDEX2", side: "buy", amountUsdg: 6 }),
reconcile: (plan) => sessionActionState(chain, plan.action),
});
保留期刊及其 .result 文档,包括成功后的文件。 忽略
.bskts-agent/ 自定义商店必须制作 reserve 独有的耐用性
创建;普通的覆盖并不妨碍竞争过程的交易.
文件存储用于共享文件系统的进程; 独立主机需要
拥有相同担保的共享商店。 部分/破损记录未关闭.
sessionActionState 在链4663的一个RPC区块上读取被钉住的模块.
未用未清款项在截止日期或之前仍未解决,因为请求
也许还在逃 读取失败让记录完好无损. 消耗的非ce
表示不需要进一步提交;它不收回交易散列.
一个已过期的未用动作作为终端结果保留,从未被替换
自动。 在选择新店名前调和上一个操作
打算进行新的交易。 错误发生后不删除要重新启动的记录 .
当省略了授权的出错时,API将其解决到50 bps的下方
和所有者的补助金最高限额。 客户端对照
policy.maxSlippageBps;在获取前拒绝对政策有明确的价值.
每日营业额包括买卖,在协调世界时00:00重订,为 每个键,不包括网络费(单元硬上限为每起行动10美元). 撤销确认的新请求;现有命令/时间表可以 仍然执行,需要单独取消。 使用新密钥重新连接 .
MCP 曝光 bskts_agent_session 财务报告和审定财务报表 bskts_agent_trade 相同项目
流动。 它不签名:您的代理主机必须提供签名和提交者.
代理密钥授权账户交易, 包括启用时的周末封面 。 承保支出按相同的每日限额单独计算;另外,承保需要账户所有人津贴。 个人密钥撤销让已存在的封面列表打开:在"我的封面"中取出. API 模块 Enabled/Cover Enabled 字段报告经常账户设置.
周末封面(SDK 0.6.0+)
探员可以 购买 周末封面,在篮子上 账户,从同一个键,一旦
所有者打开封面( O)coverEnabled) (中文(简体) ). 盖子付周末的跌幅 fromBps 财务报告和审定财务报表
toBps (300-1000:从-3%,满分-10%). 届会最多支付3%的封面(Premium +)
除贸易外,还按自己的每日限额计算。 特工从不担保.
import { coverActionState, coverRelayer, executeCoverOnce, type CoverPending } from "@bskts/sdk";
import { fileSessionStore } from "@bskts/sdk/node";
const book = await client.coverBook("DIGI64", { coverUsd: 1000, fromBps: 300, toBps: 1000 });
// book.ranges[0].quote.cost, and history.fairPer1k: what the range paid on an average weekend
const result = await executeCoverOnce({
store: fileSessionStore<CoverPending>(".bskts-agent/cover-digi64-001.json"),
sender: { key, sign: (td) => signer.signTypedData(td), submit: coverRelayer() },
maxNetworkFeeUsdg: 250_000n,
build: () =>
client.buildAgentCover({
owner,
key,
action: "take",
ticker: "DIGI64",
fromBps: 300,
toBps: 1000,
coverUsd: 1000,
}),
reconcile: (plan) => coverActionState(chain, plan.action),
});
buildAgentCover 还要 action: "request" (与 pricePer1k,将溢价锁定到
由承保人填补)和 action: "cancel" (与 listingId免费). coverPositions(account)
显示封面及其报酬, 保存者自动制作.
授权限制购买
自0.7.2起提供.
使用 buildAgentOrder({ kind: "limit", owner, key, ticker, amountUsdg, triggerNav, slippageBps, expiryDays? }) 一个没有签名的休养买.
全额预算是代管的,计入今天届会的更替。 触发器必须是正的,在极限或低于极限时使用10分钟的池平均NAV.
过期上限为会话 . slippageBps 需要: 整数从50到1000, 最多在会话中 maxSlippageBps 至少篮子 limitMinSlippageBps 从 basket() 或者说 markets({ fields: [..., "limitMinSlippageBps"] }) (bskts应用程序使用300). buyCostBps + 20 低报出产篮,其CLM储备设定出最小值. 外部值被拒绝 BAD_REQUEST 获取前; API 答案 SESSION_LIMIT (403起) BAD_REQUEST 指定篮子填充成本以下的最低值。 50 bps以下的赠款不能使用限额代管.
使用 orders(session.account) 列出开放命令 buildAgentOrder({ kind: "cancel", owner, key, orderId }) 取消账户所属限额,包括过期限额.
注销退还同一账户,不使用营业额,不补足日封顶. 可能需要网络费.
两个计划都与 executeSessionOnce 和一个耐久的商店, 就像市场交易。 永远不要重建带有新身份的超时安置.
decodeAgentOrder(plan) 阅读已签署的条款; limitOrderId(receipt.logs) 读取一个定位ID 从被绑定的代管活动 不等待索引.
创造不是一个填充。 打开顺序列表不是填充历史 。 撤销不取消现有命令;取消之前先取消或使用所有者的钱包.
授权退出、购买上限和预览
自0.8.0起提供.
buildAgentOrder({ kind: "exit", owner, key, ticker, shares, stopNav?, tpNav?, slippageBps, expiryDays? }): 无标记的停站损失(10分钟池-平均NAV在或低于时出售)stopNav(a) 获取利润(在或以上)tpNav或括号(两者均);stopNav < tpNav一个填满它.shares1e18单位的比值"max"(每个账户都持有外部订单) 股票是代管的,按其价值计算今天的营业额(当值和十分钟NAV的较高). 拒绝停在目前的NAV上下,或停在或停在它的下方,即立即出售.slippageBps要求:5-1000,在补助金范围内,至少是篮子exitMinSlippageBps. 网络费来自该账户的USDG.buildAgentOrder({ kind: "cancel-exit", owner, key, orderId })返回退出的股份。 限制和退出 ID 分开编号,可以相等: 使用类型orders()报告.exitOrderId(receipt.logs)读取一个新的出口的ID.triggerBelow: false超过或超过限额triggerNav而不是在它的下方.- 每个订单都有
preview(单位:千美元)AgentOrderPreview因此SDK、MCP和技能显示相同的数字:navNow(触发器的10分钟NAV比较),每个触发器的fromNowPct; 对于一个退出的账户avgEntry而且,每个边缘,priceReturnPct, (中文(简体) ),estNetReturnPct, (中文(简体) ),worstNetReturnPct(在0.20%的销售费之后,填充费和maxSlippageBps,包括销售费、收益和breakEvenNav; 对于限制worstPricePerShare财务报告和审定财务报表fillsNow。 。 。 .describePreview(plan.preview)让它成为线条. NAV上有触发器:取自利润比NAV多5%是5%的价格变动,而不是5%的净利润. 这个worst*数字处于触发位置, 不限制: 代管者在订单满后从NAV中定价下限,所以在缺口下限售后停售,在缺口下限售出后加价;预览版则加价basis这么说的 基于NAV的返回avgEntry并且不考虑买入成本和网络费。 签名前显示预览 .