关于 dflow-kalshi-portfolio
dflow-kalshi-portfolio 是用于只读查看钱包 Kalshi 持仓和活动的技能。它将链上余额与市场元数据关联,以计算估值、已实现盈亏、交易历史和赎回资格。
主要功能
- 01查看钱包持仓和市场标签
- 02按买价计算盯市估值
- 03查看成交记录和已实现盈亏
- 04识别符合赎回条件的仓位
- 05使用 CLI 快速查看或 API 流程
适用场景
- 01检查活动金库钱包中的持仓
- 02按当前买价估算结果代币仓位
- 03查看交易活动和已实现盈亏
- 04查找可赎回的获胜仓位
MCP 相关
使用 https://pond.dflow.net/mcp 上的 DFlow 文档 MCP 查询响应结构、分页和批量端点详情;本技能本身不提供 MCP 服务。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dflowprotocol/ dflow-skills --skill dflow-kalshi-portfolio安装后在 Claude Code 中输入/dflow-kalshi-portfolio确认已加载。
详细介绍
DFlow Kalshi 投资组合
以只读方式查看钱包的 Kalshi 活动——持仓、市值估算、已实现盈亏、成交历史、可赎回持仓。
前置条件
- DFlow 文档 MCP(
https://pond.dflow.net/mcp)——按照仓库 README 安装。此技能是操作指南;MCP 是参考依据。通过search_d_flow/query_docs_filesystem_d_flow查询确切的响应结构、分页方式和批量端点载荷——不要猜测。 dflowCLI(可选,用于快速查看持仓)——按照仓库 README 安装。
接口
没有 /positions 端点。 投资组合需要手动通过链上钱包余额和元数据关联来构建。有两种方式:
- CLI —
dflow positions— 一条命令即可转储当前激活的金库钱包中的现货和结果代币,并附带余额和市场标签。通过 CLI 可查看“我现在持有哪些资产?”,且稳定币的uiAmount已直接以美元表示。此方式不提供结果代币的标记价格、redemptionStatus或成交历史,因此结果代币估值、赎回检查和盈亏仍需通过 API 流程处理。仅限当前激活的金库。 - API — 自行构建流程 — 只要用户需要市值估算、盈亏、活动历史、赎回资格,或者查看的不是 CLI 当前激活的金库钱包,就需要使用此方式。
快速路径:dflow positions(CLI)
输出(单个 JSON 信封,在每个钱包上的格式相同):
{
"ok": true,
"data": {
"wallet": "<pubkey>",
"positions": [
{ "type": "spot", "mint": "...", "symbol": "USDC", "amount": "1326161", "uiAmount": 1.326161, "decimals": 6 },
{ "type": "outcome", "mint": "...", "symbol": "DFlowYU0192", "amount": "2000000", "uiAmount": 2.0, "decimals": 6,
"side": "yes", "market": { "title": "...", "status": "active" } }
]
}
}
type: "spot"— SOL、USDC、CASH 以及钱包中的其他资产。type: "outcome"— Kalshi 结果代币;还包含side("yes"|"no")和简要的market(title、status)。- 没有用于查看其他钱包的标志。查看其他钱包时,请使用 API 流程。
完整路径:自行构建(API)
DFlow 指南 /prediction-markets/recipes/track-positions 中的标准流程:
- 通过 Solana RPC 读取钱包余额 —
getParsedTokenAccountsByOwner(wallet, { programId: TOKEN_2022_PROGRAM_ID })。结果代币使用 Token-2022。(如需稳定币余额,也要查询经典 SPL 代币程序。) POST /api/v1/filter_outcome_mints— 发送钱包的铸币地址列表,获取其中的 PM 结果代币铸币地址。POST /api/v1/markets/batch— 获取这些结果代币铸币地址对应的完整市场元数据(标题、状态、closeTime、yesBid/yesAsk/noBid/noAsk、redemptionStatus、accounts.yesMint/noMint)。- 关联 — 将每项持仓映射到对应市场;通过将持有的铸币地址与
accounts.yesMint/accounts.noMint匹配,确定是 YES 还是 NO。
字段级详情(响应信封、分页)→ 文档 MCP。
基于该流程构建的视图
当前持仓
即上述流程的输出。也可为每项持仓附加当前标记价格(YES 持仓使用 yesBid,NO 持仓使用 noBid——见下文的市值估算)。
未实现市值估算
按结果代币所在一侧的买价计算每项持仓的价值(即你可以卖出的价格),而不是卖价:
- 持有 YES →
uiAmount * parseFloat(yesBid) - 持有 NO →
uiAmount * parseFloat(noBid)
对一个钱包的所有持仓求和,得到未实现总价值。减去成本基础(见下文)即可得出未实现盈亏。
已实现活动和盈亏
GET /api/v1/onchain-trades?wallet=<pubkey>&sortBy=createdAt&sortOrder=desc&limit=N — DFlow 索引的钱包链上成交记录视图。
- 活动流:每行包含
createdAt、marketTicker、side、inputAmount、outputAmount、transactionSignature。 - 每个市场的成本基础:跟踪每个结果代币铸币地址的结算代币净流量(买入时流入的结算代币减去卖出时流出的结算代币)。
- 费用:对所有成交中的结算代币
feeAmount求和。
可赎回仓位
只有同时满足以下三项,持仓才可赎回:
- 市场
status为determined或finalized, - 市场
redemptionStatus为"open", - 持有的结果 mint 是获胜方(根据市场
result判断)。
要赎回,请转交给 dflow-kalshi-trading(赎回就是将获胜方卖回结算 mint)。
待处理订单检查
如果应用本身提交了订单,请保存提交时返回的 orderAddress,并轮询 GET /order-status?orderAddress=<addr>,直到订单进入终态。没有按钱包查询订单的接口。大多数成交都会在 CLI 的 120s 轮询时限内结束,因此这通常不会成为用户需要关心的问题;但在维护窗口之外,不要假定具体的成交时间。
应该询问用户什么(以及不该询问什么)
视图形式——明确无误时自行判断,不明确时请用户确认:
- 视图类型——持仓 / 按市值计价 / 已实现盈亏 / 活动 / 可赎回。
- 钱包公钥——仅 API 需要(CLI 使用当前激活的 vault 钱包)。
基础设施——务必询问,绝不要自行推断(仅适用于 HTTP/RPC 流程;dflow positions 快速路径两者都不需要):
- DFlow API 密钥(仅当脚本直接调用 Metadata API 时需要,例如
markets/batch、onchain-trades等)。CLI 快速路径(dflow positions)不需要密钥——它使用 CLI 中保存的配置。对于 HTTP 流程,请直接、中立地询问:“你有 DFlow API 密钥吗?” 不要擅自假定密钥存放在哪里——例如 “环境变量里有吗?” 或 “DFLOW_API_KEY已设置吗?” 之类的说法,会引导用户使用他们并未要求的环境变量默认值。让用户选择;不要暗中回退到环境变量或 dev。所有地方都使用同一个 DFlow 密钥——同一个x-api-key即可访问 Metadata API 和 Trade API。回答“有”→ 生产环境主机https://prediction-markets-api.dflow.net,并使用x-api-key。回答“没有”→ dev 主机https://dev-prediction-markets-api.dflow.net,该主机有速率限制。相关链接:https://pond.dflow.net/get-started/api-key。生成脚本时,请在启动时记录最终使用的主机和密钥是否存在。 - RPC URL——此处要询问,不同于现货 / PM 交易或市场数据场景。HTTP 流程会通过 RPC 直接读取代币账户;没有钱包可以代你完成此操作。建议使用 Helius。使用
dflow positions快速路径的 CLI 用户不需要提供 RPC URL——dflow setup已完成配置。
不要询问:
- 结算 mint、滑点、费用、签名——这是只读技能。如果用户转而想操作仓位,请转交给
dflow-kalshi-trading。
注意事项(文档 MCP 不会主动告诉你这些)
- 没有
/positions端点。 投资组合 = 钱包余额 + 元数据关联。别指望从 API 找到捷径。 - 结果代币使用 Token-2022 程序。 使用
TOKEN_2022_PROGRAM_ID,而不是经典代币程序。USDC / SOL / CASH 则需单独查询经典程序。 - 按市价计值 = 买价,而非卖价。 持有 YES →
yesBid。持有 NO →noBid。按卖价计值会高估投资组合。 - 有两个 POST 端点。
filter_outcome_mints和markets/batch都通过 POST 请求体接收地址列表。很容易误用 GET,导致请求失败。 - 稳定币不是结果代币。
filter_outcome_mints会将其剔除(它们用于结算,而非持仓)。需在 PM 视图之外单独跟踪 USDC / CASH 余额。 - 可赎回状态需要三个条件同时满足,不能只看“市场已关闭”。只有当状态、
redemptionStatus和获胜方都匹配时,才显示可赎回列表。 - 成交后余额有延迟。 刚上链的成交可能不会立即显示在未索引的 RPC 上——交易最终确认后,代币账户更新才会传播。快速刷新时请做防抖;如果用户预期余额会变化但没有看到,请重试后再判断是否失败。
dflow positions仅适用于当前活跃金库。 没有--wallet标志;切换钱包需使用dflow setup或 API 流程。dflow positions返回的是余额,不是标记价格。 对结果代币,你会得到amount/uiAmount/decimals,以及side+market.title+market.status。这些数据已足以估算 USDC 和 CASH 的美元价值(其uiAmount≈ 美元价值,可能受脱锚影响);但结果代币需要从markets/batch获取yesBid/noBid来计值,其他现货代币(SOL 等)则需要外部现货价格。输出中也没有redemptionStatus或成本基准——需搭配markets/batch判断是否可赎回,并使用/onchain-trades计算盈亏。- 已关闭的结果代币账户。 全部卖出或赎回后,代币账户可能会关闭(回收租金),之后便不会再显示在钱包中。这是正常情况——如需查看记录,请检查 onchain-trades 历史。
- 同一市场、不同通道 = 单独的持仓。 DFlow 上的每个 Kalshi 市场都有 USDC 通道和 CASH 通道,各自拥有独立的
yesMint/noMint。钱包可以在同一市场的两个通道都持有 YES——它们是投资组合中的两行记录,有两条赎回流程,市价计值也分别计算后再相加。实际中较少见(大多数用户只使用一个通道),但出现时应妥善处理。 - 两个界面,两种认证方式。
dflow positions会通过 CLI 调用,并使用其存储的配置(密钥、钱包、RPC)——该脚本不会为这次调用传入任何参数。自行构建的 HTTP 流程(markets/batch、onchain-trades、RPCgetParsedTokenAccountsByOwner)使用普通 HTTP/RPC,需要显式传入 DFlow API 密钥 + RPC URL。两者相互独立:CLI 存储的密钥无法被同级 HTTP 客户端访问。只有使用 HTTP 流程时才询问 API 密钥 + RPC。
遇到不符合上述说明的情况
对于上述未涵盖的内容——filter_outcome_mints / markets/batch / onchain-trades 的完整响应封装、分页参数、涉及 Proof 的状态、redemptionStatus 转换的边缘情况、订单状态的终止状态——请查询文档 MCP(search_d_flow、query_docs_filesystem_d_flow)。不要猜测。
如需可运行的参考代码,请参阅 /prediction-markets/recipes/track-positions(以及其中的 Cookbook Repo 链接)。
相关技能
dflow-kalshi-trading— 卖出、赎回或以其他方式处理你在此处看到的持仓。dflow-kalshi-market-data— 获取你正在关注的持仓所对应的市场数据(订单簿、成交、K 线、比赛中数据)。dflow-kalshi-market-scanner— 寻找可开仓的新市场。dflow-proof-kyc— 在钱包买入新持仓前验证钱包。