Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 6788,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 801616,
"Makefile": 4272
},
"pushed_at": "2026-07-20T11:08:26Z",
"created_at": "2026-01-19T10:24:20Z",
"owner_type": "Organization",
"updated_at": "2026-07-20T11:08:59Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": null,
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "polymas",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/250326890?v=4",
"created_at": "2025-12-18T10:38:45Z",
"is_verified": null,
"public_repos": 5,
"account_age_days": 221
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "v1.12.5",
"kind": "patch",
"published_at": "2026-07-20T11:07:52Z"
},
{
"tag": "v1.12.4",
"kind": "patch",
"published_at": "2026-07-20T00:51:30Z"
},
{
"tag": "v1.12.3",
"kind": "patch",
"published_at": "2026-06-12T23:31:53Z"
},
{
"tag": "v1.12.2",
"kind": "patch",
"published_at": "2026-06-10T02:55:23Z"
},
{
"tag": "v1.12.1",
"kind": "patch",
"published_at": "2026-05-29T12:40:32Z"
},
{
"tag": "v1.12.0",
"kind": "minor",
"published_at": "2026-05-29T12:14:48Z"
},
{
"tag": "v1.11.2",
"kind": "patch",
"published_at": "2026-05-24T17:03:07Z"
},
{
"tag": "v1.11.1",
"kind": "patch",
"published_at": "2026-05-24T15:09:14Z"
},
{
"tag": "v1.11.0",
"kind": "minor",
"published_at": "2026-05-24T14:24:55Z"
},
{
"tag": "v1.10.14",
"kind": "patch",
"published_at": "2026-05-24T13:09:14Z"
},
{
"tag": "v1.10.13",
"kind": "patch",
"published_at": "2026-05-24T10:28:49Z"
},
{
"tag": "v1.10.12",
"kind": "patch",
"published_at": "2026-05-24T10:23:26Z"
},
{
"tag": "v1.10.11",
"kind": "patch",
"published_at": "2026-05-09T03:39:34Z"
},
{
"tag": "v1.10.10",
"kind": "patch",
"published_at": "2026-05-09T02:07:36Z"
},
{
"tag": "v1.10.9",
"kind": "patch",
"published_at": "2026-05-08T10:14:39Z"
},
{
"tag": "v1.10.8",
"kind": "patch",
"published_at": "2026-05-07T05:47:34Z"
},
{
"tag": "v1.10.7",
"kind": "patch",
"published_at": "2026-05-07T03:47:12Z"
},
{
"tag": "v1.10.6",
"kind": "patch",
"published_at": "2026-05-06T10:21:09Z"
},
{
"tag": "v1.10.5",
"kind": "patch",
"published_at": "2026-05-06T10:12:57Z"
},
{
"tag": "v1.10.4",
"kind": "patch",
"published_at": "2026-05-05T23:38:02Z"
},
{
"tag": "v1.10.3",
"kind": "patch",
"published_at": "2026-05-05T23:30:10Z"
},
{
"tag": "v1.10.2",
"kind": "patch",
"published_at": "2026-05-05T23:22:14Z"
},
{
"tag": "v1.10.1",
"kind": "patch",
"published_at": "2026-05-05T22:40:52Z"
},
{
"tag": "v1.10.0",
"kind": "minor",
"published_at": "2026-05-05T13:32:11Z"
},
{
"tag": "v1.9.0",
"kind": "minor",
"published_at": "2026-05-05T12:53:32Z"
},
{
"tag": "v1.8.3",
"kind": "patch",
"published_at": "2026-04-28T21:38:00Z"
},
{
"tag": "v1.8.2",
"kind": "patch",
"published_at": "2026-04-28T21:06:04Z"
},
{
"tag": "v1.8.1",
"kind": "patch",
"published_at": "2026-04-28T16:14:18Z"
},
{
"tag": "v1.8.0",
"kind": "minor",
"published_at": "2026-04-28T15:00:41Z"
},
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2026-04-28T03:20:16Z"
},
{
"tag": "v1.6.2",
"kind": "patch",
"published_at": "2026-04-18T11:43:53Z"
},
{
"tag": "v1.6.1",
"kind": "patch",
"published_at": "2026-04-17T08:35:44Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2026-04-17T08:35:40Z"
},
{
"tag": "v1.5.5",
"kind": "patch",
"published_at": "2026-04-13T15:01:18Z"
},
{
"tag": "v1.5.4",
"kind": "patch",
"published_at": "2026-04-03T09:50:28Z"
},
{
"tag": "v1.5.3",
"kind": "patch",
"published_at": "2026-03-14T07:50:08Z"
},
{
"tag": "v1.5.2",
"kind": "patch",
"published_at": "2026-03-14T07:25:24Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2026-03-14T06:45:46Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-03-13T18:36:48Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-03-08T19:38:24Z"
},
{
"tag": "v1.3.2",
"kind": "patch",
"published_at": "2026-02-19T03:57:06Z"
},
{
"tag": "v1.3.1",
"kind": "patch",
"published_at": "2026-02-12T11:42:06Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-02-12T08:58:59Z"
},
{
"tag": "v1.2.3",
"kind": "patch",
"published_at": "2026-02-11T09:03:08Z"
},
{
"tag": "v1.2.2",
"kind": "patch",
"published_at": "2026-02-11T08:43:07Z"
},
{
"tag": "v1.2.1",
"kind": "patch",
"published_at": "2026-02-11T08:25:16Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-01-25T20:21:22Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-01-22T17:02:41Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-01-19T17:43:37Z"
},
{
"tag": "v0.1.0-split-merge",
"kind": "prerelease",
"published_at": "2026-01-22T17:02:41Z"
},
{
"tag": "v0.0.4",
"kind": "patch",
"published_at": "2026-01-19T11:01:26Z"
},
{
"tag": "v0.0.3",
"kind": "patch",
"published_at": "2026-01-19T10:41:52Z"
},
{
"tag": "v0.0.2",
"kind": "patch",
"published_at": "2026-01-19T10:29:35Z"
},
{
"tag": "v0.0.1",
"kind": "patch",
"published_at": "2026-01-19T10:29:35Z"
}
],
"recent_commits": [
{
"oid": "d5610992b60cac471755e7322f1f782ecd469ce1",
"body": null,
"is_bot": false,
"headline": "fix: correct beacon deposit wallet create2 hash",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-07-20T11:07:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dacc21f84fce0859e78de70ad2d0aa9894f62e22",
"body": null,
"is_bot": false,
"headline": "fix: support legacy UUPS and beacon deposit wallets",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-07-20T00:51:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7dfc9621e68b0445795b4142e8b675002a3ad4a",
"body": "三处根治长期困扰自动赎回的 relayer 失败:\n\n- V2 relayer key 懒加载去掉 sync.Once:取 key 失败不再永久降级旧鉴权\n (旧行为导致进程启动时一次 SIWE 失败 → 之后每笔 /submit 都 401\n invalid authorization,只能重启),改为带 30s 退避的按需重试;\n 新增 invalidateV2RelayerKey 作废内存注入 + 磁盘缓存。\n- executeGaslessBatch 拆为包装层 + 单次执行,对两类可自愈错误自动\n 重建批次(重新取 nonce 重签)重试一次:401 → 作废 key 重派生\n[…]\ndy},\nError() 字符串与旧格式完全一致,下游字符串匹配不受影响。\n新增 gasless_relay_retry_test.go:mock relayer + mock RPC 覆盖\n401 重试、would-revert 重试、其他 4xx 不重试、nonce 断连重试四场景。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(gasless): relayer 错误自愈——401 重派生 V2 key、预模拟 revert 与 nonce 瞬断重试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-06-12T23:31:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "860a076c3d5cbe65366c220b6939de4949c74e18",
"body": "type-3(CWIA/POLY_1271)签名的 verifyingContract 域取决于市场是否 NegRisk:\n非 NegRisk→ExchangeV2,NegRisk→NegRiskExchangeV2。V2 批量路径此前把整批\nnegRisk 写死 false,NegRisk 市场单子全部按错误域签名,服务端报\n\"invalid POLY_1271 signature: signature does not match order hash\";而重试\n判据只匹配 \"invalid signature\",对该错误串永不触发,单子永久失败。\n\n- baseClient.negRis\n[…]\nmatch\n order hash,覆盖 1271 钱包错误串\n- clob/sig_retry_test.go:离线锁定重试判据回归\n- cmd/poly1271_negrisk_repro:链上只读 eth_call 复刻改动前后差异(已实测复现+修复)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): NegRisk 市场逐 token 签对 POLY_1271 exchange 域,放宽重试判据",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-06-10T02:55:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "243bb7b1752b27ba713d698272e16a0809ba2e3f",
"body": "V2 relayer 鉴权由私钥自动铸的 RELAYER_API_KEY 完成,不需要旧的 POLY_BUILDER_*\nHMAC 三元组。把仍硬性 log.Fatal 要求三元组的 example 改成可选(有就用、没有则传\nnil 自动铸 V2 key):v2_wrap / relayer_tx_status / cwia_smoke / legacy_proxy_repair。\nwithdraw_pusd_cwia 用的是 POLY_API_*(CWIA 提现桥),不在此范围,未动。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(examples): 移除过时的 POLY_BUILDER_* 三元组硬性要求",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-29T12:40:32Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "57970c360fd6a7e76d73aca8d521c2a3e3a8e588",
"body": "Polymarket 在 2026-04 后把 Ctf/NegRiskCtfCollateralAdapter 重新部署到新 vanity\n地址,relayer 白名单随官方 ts-sdk/py-sdk 切换;旧地址链上仍在但 relayer 不再放行\n(提交即 STATE_FAILED,秒拒无 hash)。此前误判为'relayer 硬封 NegRisk redeem',\n真因是 SDK adapter 地址过时。\n\n- internal/contracts.go: 两个 V2 adapter 地址迁到官方现行(旧地址留注释标 deprecated)\n · CtfCollateralAda\n[…]\nata_check 残留旧地址;\n 新增 redeem_eoa_direct(EOA 自付直发,无 relayer 时的兜底)\n- 实测:gasless NegRisk redeem n=3 钱包全通过(tx 0x698d8c59 / 0xba230b4b / 0x8c915f33)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): 迁移 V2 adapter 到官方现行地址,修复 gasless NegRisk redeem",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-29T12:14:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "77ce60f5fecbbb3d6800ac3c9c0fe8ce2031a863",
"body": "v1.11.0 把 NegRisk redeem 切到 NegRiskCtfCollateralAdapter(pUSD 出口)\n后实测仍 500 — 根因不在 auth:\n\n CWIA wallet 缺 CTF.setApprovalForAll(NegRiskCtfCollateralAdapter, true)\n 而这一笔 approve 补不上:\n EOA → wallet.execute() revert OnlyFactory() (0x0c6d42ae)\n EOA → factory.proxy() revert Only\n[…]\n - 新增 5 个诊断 example:claim_test / approve_nrcta_probe /\n approve_nrcta_direct / negrisk_calldata_check / relayer_v2_submit_probe\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): NegRisk redeem 改走 legacy NegRiskAdapter,绕开 adapter approve 死锁",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-24T17:03:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f46e713dbf0790d019586c409101580c7bb41c1e",
"body": "之前 HTTP 非 200 只 log 状态码,body 全塞进返回的 error 里 — 上层\ncaller 没把 err 一起打就丢了诊断信息。NegRisk 500 时尤其难定位是\nSDK 编码错还是 relayer 内部炸。\n\n现在直接 log:\n body=<前 200 字符>\n cf-ray=<cloudflare 请求 id> content-type=<返回类型>\n\ncf-ray 在向 polymarket 报 bug 时也有用。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(gasless): relayer 错误日志带上 body 和 cf-ray",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-24T15:09:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a843db5cd1567e99823bb3096c77dc775b4c1345",
"body": "POLY_BUILDER_* HMAC 五件套已被 polymarket relayer 弃用,这是\nNegRisk redeem 一直收到 HTTP 401 invalid authorization 的根因\n(之前误判为 Unverified Builder Tier 白名单问题)。\n\n切到 V2 协议:\n- internal/relayer_v2_auth.go: SIWE (EIP-4361 personal_sign) 派生\n V2 API key,带本地缓存 (~/.polymarket/relayer_key_<EOA>.json)\n + GET /relayer/api/k\n[…]\ntionId 的多 outcome 自动合并成一笔 adapter 调用。\n- Regular redeem 走旧 CTF.redeemPositions 长签名路径不变,\n Safe 仍收 USDC.e(不是 pUSD),不破坏 v1.10.13 的行为。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(gasless): 切到 V2 relayer 协议 + 修 NegRisk redeem",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-24T14:24:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5bd1dbcf4d054c94668cf774c94d8e214508f0b0",
"body": "新增两个例子,为后续切换 relayer 认证协议铺路:\n\n- examples/relayer_apikey_mint: SIWE 全链 + get-or-mint + 本地缓存\n POST /relayer/api/auth 自助创建 V2 RELAYER_API_KEY,\n 优先复用 GET /relayer/api/keys 已存在的密钥,避免每次累积新 key。\n\n- examples/relayer_v2_submit_probe: 验证 V2 头是否被写端点接受\n 对比无认证与带 V2 头的 HTTP 状态码,判定 RELAYER_API_KEY +\n RELAYER_A\n[…]\n 401 invalid authorization,\n怀疑 SDK 还在用已弃用的 POLY_BUILDER_* 协议。第三方 cli 和 polygolem 都\n确认现行 relayer-v2 用的是 SIWE 派生的 V2 API key + 明文双头。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(examples): V2 relayer API key 获取与认证探针",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-24T13:09:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "272d40702f06ac8a1bee52d1cad3b1cab42e09e5",
"body": "之前 encodeProxy 用的 selector 0x415565b0 + 非标准偏移(tuple_offset=0x84、\ndata_offset=0x60、data 末尾不补 32 字节)。RelayHub 解码后找不到对应函数,\nacceptRelayedCall 抛 CanRelayFailed(reason=4)——所有 sig_type=1 (PolyProxy)\n走 factory.proxy 的批次都被静默拒绝(HTTP 200 + 链上 status=1,但 proxy 状态\n未变)。\n\n链上已验证的正确编码(成功提现 tx 0x96c0c27e...):\n- selec\n[…]\n9b800223cf4fb0e0372eb5e08e57e9749dec2a8a)。\n\n不影响 Safe/CWIA:它们各有 buildSafeRelayTransactionBatch /\nbuildCWIARelayTransactionBatch,不经过 encodeProxy。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(gasless): 修复 PolyProxy encodeProxy 的错误 selector 与非标准 ABI 编码",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-24T10:28:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "30196ac0f2430fedc17e7874ce1ef6a4c40c98de",
"body": "CtfCollateralAdapter (0xADa100...) 和 NegRiskCtfCollateralAdapter (0xAdA200...)\n不在 Polymarket relayer 的 builder 白名单内,approve / setApprovalForAll 它们的\ncalldata 会被 relayer 直接拒(\"call blocked: ... is not in the allowed list\")。\n\n老逻辑把这俩列进 V2 必查 spender/operator → IsV2Ready 永远 ready=false →\nEnsureV2Ready 一直触\n[…]\n再代为兜底,需 split/merge\n走 adapter 路径的业务自行通过 EOA 直签或 Safe 多签补这两个授权。NegRisk redeem\n已在 c17e9e2 切到 CTF + WCol.unwrap 两步法,本就不依赖这两个 adapter。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): IsV2Ready 移除两个 adapter,避免 EnsureV2Ready 死循环",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-24T10:23:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c17e9e2028fe67fba5ace7fb267acbb0739ae277",
"body": "实测 Polymarket Gasless Relayer 在 Unverified Builder Tier 下封禁了所有\n经 NegRiskAdapter / NegRiskCtfCollateralAdapter 的 redeem (27ms 内 STATE_FAILED\n不广播,TS/Go 同症状),但 CTF 长签名 redeem 与 WCol.unwrap 走得通。\n\n改动:\n- NegRisk redeem 拆成两步进 Safe MultiSend:\n 1) CTF.redeemPositions(wcol, 0, conditionId, [1<<idx])\n 2) WCo\n[…]\n删除不再用的 encodeRedeemNegRiskShort\n- RedeemPositionInfo.Size 字段统一必填\n- 新增 GetRelayerTransaction(id) 用于事故诊断 + relayer_tx_status example\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(v2): NegRisk redeem 绕开 NegRiskAdapter,走 CTF + WCol.unwrap 两步",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-09T03:39:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "da8265edd1c77981c34e671c1500f19e04122ae4",
"body": "…revert\n\nNegRiskAdapter.redeemPositions 内部 ctf.safeBatchTransferFrom(safe → adapter)\n要求 Safe 事先把 NegRiskAdapter 设为 ERC1155 operator。原 V2 approval 列表\n(Exchange / NegRiskExchange / Ctf*CollateralAdapter)漏了这一项,纯 V2 路径\n开通的 Safe 调直连 redeem 必失败。\n\n- ctfOperatorsV2() 加入 PolygonNegRiskAdapter(EnsureV2Ready 自动补齐)\n- SetV2Allowances / WrapAndApproveV2 / ApproveAdaptersV2 同步加上\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): 补 CTF.setApprovalForAll(NegRiskAdapter),否则 NegRisk redeem 必 …",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-09T02:07:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "85659d259fce5dbd1172b4dd19a668bacbb15c43",
"body": "Polymarket Gasless Relayer 的 redeem 白名单只放行 ConditionalTokens /\nNegRiskAdapter,到 CtfCollateralAdapter / NegRiskCtfCollateralAdapter 的\nredeem 会被静默拒绝(STATE_FAILED 无 reason)。\n\n- Regular: to=ConditionalTokens, 长签名 indexSets=[1<<OutcomeIndex]\n- NegRisk: to=NegRiskAdapter, 短签名 0xdbeccb23 amounts[OutcomeIndex]=Size\n- RedeemPositionInfo 字段改为 OutcomeIndex+Size,对齐官方 builder example\n- split/merge 仍走 CtfCollateralAdapter(白名单允许)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): RedeemPositions 直接调底层 CTF/NegRiskAdapter,避开 Relayer 白名单",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-08T10:14:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "aa80604d2556eb76f7c60a4002f83d289ef18caf",
"body": "postOrdersBatchV2 在 \"orderbook X does not exist\" 触发剥离重试时,被剥离的订单不再从返回数组中消失;改为在原始下标位置回填合成响应(Status=OrderStrippedStatus,ErrorMsg 含 tokenID)。调用方可安全地按 results[i] 与 orderArgsList[i] 对齐,无需理解 SDK 内部剥离机制。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(clob): CreateAndPostOrders 返回数组与入参等长同序",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-07T05:47:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3dedac92d8448a8847694d78847362afb2980a60",
"body": "读批量端点(midpoints/spreads/last-trades-prices/prices/books):\n- sanitize 增加 ERC1155 tokenId 格式校验:仅放行 1~78 位十进制且非全 0\n (hex/字母/\"0\"/超长串等明显垃圾在发请求前就被剔除,省网关往返)\n- GetPrices 现在也走 sanitizeBookParams(之前漏过)\n- GetMultipleOrderBooks 全坏输入时返回 [],与其余 4 个端点行为一致\n (不再 \"请求数组不能为空\" 报错)\n- 更新 sanitizeTokenIDs 注释:V2 网关已宽容(emp\n[…]\n3 轮,被剥离的订单不出现在\n 返回数组里——业务层对照输入/输出长度即可识别哪些被丢\n\n效果:业务层把任意来源的 tokenId 列表(含已 redeem/已下架/数据不全的脏数据)\n直接喂进批量接口都能拿到干净结果,不再需要自己做格式过滤或部分失败兜底。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(clob): batch 接口的坏 tokenId 在 SDK 层透明处理",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-07T03:47:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f473dd7026fc95d1ebc21e106902ea91090f6297",
"body": "新增能力:\n- web3.GaslessClient.DeployDepositWallet(force bool) (*Receipt, error)\n - force=false:链上探测已部署则跳过(幂等)\n - force=true :强制走一次 relayer(调试用)\n- web3.IsDepositWalletDeployed(ctx, wallet) (bool, error)\n- web3.ErrDepositWalletNotDeployed sentinel\n- web3.CWIADeployBody 对应 type=WALLET-CREATE,schema 与\n \n[…]\n流程\n\n提交体共享:\n- 新增 submitGaslessSimple(body, label) 复用 HMAC + POST + receipt 等待\n 的逻辑,与 executeGaslessBatch 解耦(后者参数签名是 proxyTxns 不通用)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cwia): WALLET-CREATE 部署接口 + 未部署钱包的清晰错误处理",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-06T10:21:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0a820e383884988ba6b488ce03eaf3664eb75af6",
"body": "错误现场:\n EnsureV2Ready 失败: failed to read on-chain safe nonce:\n failed to unpack nonce result: abi: attempting to unmarshal an\n empty string while arguments are expected\n\n根因:counter-factual Safe(CREATE2 推导出地址但合约还没部署)调用\nsafe.nonce() 时 eth_call 返回空 bytes(地址上没合约代码)。后续 ABI\nUnpackIntoInterface 试图把空 byte\n[…]\nnce 返回值一致。\n\n修:read length==0 直接返回 (0, nil)。后续 buildSafeRelayTransactionBatch\n里 relayer/chain nonce 比对逻辑会接受这个 0,正常走 deploy+exec 流程。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(gasless): Safe 未部署时 on-chain nonce 读空 bytes 不再报错",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-06T10:12:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1ea913ac39426e0bbddefa3cec44ac22a5c38aac",
"body": "修复运行时 400 \"invalid signature\"。\n\n根因:v2 + signatureType=3 (POLY_1271) 不是普通 EIP-712 ECDSA 签名,而是\nsolady 的 ERC-1271 嵌套 TypedDataSign 格式。我们之前 sigType=3 沿用普通\nECDSA → 65 字节签名,CLOB v2 验证必然失败。\n\n签名构造(对照 py-clob-client-v2 _build_poly_1271_order_signature):\n\n contents_hash = keccak256(abi.encode(ORDER_TYPE_HASH\n[…]\nCDSA 路径\n - 3 (CWIA/POLY_1271) → 新 solady 嵌套路径\n\n附 TestSignV2OrderPoly1271AgainstPython:用与官方 Python 完全相同的\n输入对比签名字节,317 字节字节级一致。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): CWIA/POLY_1271 用 solady ERC-1271 嵌套签名(修 invalid signature)",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T23:38:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3b7d1d47841116fe0d5712749f85d219967e8b22",
"body": "对照 py-clob-client-v2 order_to_json_v2() 把 V2 order POST 的 wire body\n补齐到与官方一致:\n\n order: { ..., expiration, ... }\n request: { order, owner, orderType, deferExec, postOnly }\n\n字段语义:\n- Expiration int64 : GTD 订单过期 unix 秒;0 = GTC(不过期)\n 仅出现在 wire body,不参与 V2 EIP-712 签名结构\n- PostOnly b\n[…]\n造这三个字段)行为完全不变\n- 只在 V2 路径生效;V1 路径忽略\n\n测试:\n- TestV2OrderBodyShape:字段顺序对照官方 to_dict 锁死\n- TestV2OrderBodyExpirationGTD:非零 Expiration 透传\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(v2): OrderArgs 加 Expiration/PostOnly/DeferExec 可选字段",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T23:30:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eaf463e4a138975dc94c6a404372af8e7a949bcc",
"body": "修复运行时 400 错误:\n \"the order signer address has to be the address of the API KEY\"\n\n根因:v2 CLOB 把 signatureType=3 视为 POLY_1271(EIP-1271 合约钱包签名),\n此时 order.signer 字段必须等于 funder/proxy 地址,不能是 EOA。\n对照官方 py-clob-client-v2 order_builder/builder.py:_v2_order_signer:\n\n if signature_type == POLY_1271:\n \n[…]\n的语义),导致\nv2 后端校验不通过。\n\n影响范围:仅 V2 + CWIA。EOA / PolyProxy / Safe 的 signer 规则保持不变。\n\n附 TestV2OrderSignerByType 锁四种类型的 maker/signer 派生规则。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): CWIA 订单 signer 字段必须 = proxy 而非 EOA (POLY_1271)",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T23:22:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4f70d7596b54dbedbcc7d67ddd6ce424220cda6f",
"body": "cwia_smoke 用法:\n ./cwia_smoke # dry-run:派生地址 / 链上 nonce / 待提交 body 预览\n ./cwia_smoke -submit # 真正走 GaslessClient 提交一次 SetV2Allowances\n # (3 笔 approve,幂等无副作用)\n ./cwia_smoke -target X -data 0x... # 自定义 batch 内 call\n\n输出含 EIP-712 digest + 签名 + ecrecover 自检,relayer 拒绝时可直接对照\n预览 body 排查字段。\n\n.gitignore:把 bin/ 和根目录历史遗留的几个 stray binary 排除。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(examples): 加 cwia_smoke 端到端冒烟工具 + .gitignore 收尾",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T22:46:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0af5946c4255931f55b90f870aaac90413e84874",
"body": "对照 github.com/Polymarket/py-builder-relayer-client 的\nDepositWalletBatchRequest.to_dict() 校准——v1.10.0 推断的字段名几乎全错,\nrelayer 必然 400 拒掉。\n\n旧 body(错误):\n {data, from, metadata, nonce, proxyWallet, signature, to, type}\n ↑ data 含 factory.proxy() calldata(多余,relayer 自己编码)\n ↑ 缺 deadline / calls\n ↑ proxyWall\n[…]\nfactory.proxy() 的用户使用,不影响 relayer 流程\n- TestCWIARelayBodyShape 锁字段顺序回归\n\n仍未实现:WALLET-CREATE(首次部署 DepositWallet)—— 用户首次注册场景\n不常用,留待后续。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(cwia): /submit body schema 改为官方 depositWalletParams 嵌套结构",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T22:40:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c838ac71bf6e6b24a559a22cecdd994ff905c151",
"body": "链上确定性部分(已对照真实链上 tx 字节级验证):\n- signing.CWIABatch / CWIACall + EIP-712 Hash / Sign\n - BATCH_TYPEHASH / CALL_TYPEHASH 复刻 WalletLib.sol\n - Domain \"DepositWallet\" v\"1\",verifyingContract = wallet\n - 用 tx 0xf966…d825 ecrecover 验证签名者 == wallet.owner()\n- web3.BuildCWIABatchCalldata:编码 factory.proxy([batch]\n[…]\nhAgainstOnChainSample(EIP-712 ↔ ecrecover)\n- TestSignCWIABatchRoundtrip\n- TestBuildCWIABatchCalldataMatchesOnChainTx(calldata 字节级)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cwia): 新版代理钱包 gasless 链上层完整支持 + relayer 提交",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T13:32:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ecb7c78ab5c183eec6bcf9591b753e0bf86a6bd7",
"body": "新注册账号默认走 ERC-7760 / ERC-1967 + immutable args 的 DepositWallet,\n与老的 PolyProxy(1) / Safe(2) 并存,老账号不迁移。\n\n派生路径:DepositWalletFactory.predictWalletAddress(impl, bytes32(owner))\n其中 impl 通过 factory.implementation() 实时读取,未来 impl 升级零改动。\n\n- types: 新增 CWIASignatureType = 3\n- internal/contracts: 新增 PolygonDeposi\n[…]\nddress switch\n- clob/orders(_v2): maker 走 proxy 地址、signatureType 透传 3\n- web3/cwia_proxy_test: 用真实样例 0x9789…cee4 → 0x6CBf…4859 验证派生\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(web3): 支持 Polymarket 新版代理钱包 (CWIASignatureType=3)",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-05-05T12:53:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eacd4b88c3b92d4d27e54ce8ddfb88862748b36e",
"body": "clob-v2.polymarket.com 在 2026-04-28 切换日后 301 重定向回\nclob.polymarket.com,Go http 默认跟随 301 时把 POST 降级成 GET,\n服务端拒绝 GET 返回 405 Method Not Allowed,导致 V2 PostOrder\n等所有写接口完全不可用。\n\n修法:WithV2() 只切签名路径,host 保持默认 ClobAPIDomain,跟\ninternal/constants.go 已有注释一致。\n\n新增 examples/v2_place_cancel_smoke 做端到端冒烟(PostOrder →\nGetOrders → CancelOrder → 复查),主网 BTC Up/Down 市场\n$0.05 notional 验证通过:tx orderID=0x35f82433...,下单 live、\n撤单后 status=CANCELED。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): 切换日后 WithV2 不再覆盖 host",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-28T21:38:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d6e7fcbc842ceaa5d1bd6dbc9a279de305a55904",
"body": "老地址 0x05Cd... 是早期 V1 试验残留,链上 setApprovalForAll\n即便返回 true 也不会触发自动 redeem。从前端 SAFE 调用 calldata\n反推出真正的 V2 服务地址 0xf3cF...,并保留老地址常量便于排查\n历史残留。\n\n已在主网用 Safe 0xC789... 验证授权 (tx 0x7e64b665...),\nIsAutoClaimEnabled 现在能反映真实状态。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(v2): 修正 auto-claim operator 地址",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-28T21:06:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cc33a9e83e38ac58cc4c5ba0e4ad883140f23324",
"body": "GetMidpoints / GetSpreads / GetLastTradesPrices / GetMultipleOrderBooks\n之前把入参原样拼成 [{\"token_id\":\"\"}, ...] 发往 CLOB,整批被拒为\nHTTP 400: {\"error\":\"Invalid payload\"} (业务侧仓位列表偶发 TokenID == \"\"\n触发)。改为:\n\n- sanitizeTokenIDs / sanitizeBookParams 在发请求前 trim + 过滤空串 +\n 按原顺序 / (TokenID, Side) 元组去重\n- 全空入参短路返回,避免发出注定失败\n[…]\ntp.Post\n 迁到 PostRaw,让它们和另外两个端点一样能携带 payload 摘要\n\n测试:clob 包新增 9 个单元测试覆盖 sanitize / payloadSnippet /\n全空短路 / 长度上限 / HTTP 失败 error 格式。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(clob): 批量端点过滤空 token_id 并在 error 中带 payload 摘要",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-28T16:14:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ce253d0d186ca706b516ffa00b0c76f2f9bae4b4",
"body": "业务层进场前的\"一键自检+自动修复\"。前置条件 11 项全检,缺啥补啥\n打成一笔 gasless batch;都齐则 (nil, nil) 不发 tx。\n\n- web3/gasless_v2_ensure.go:\n - IsV2Ready() (ready, missing, err) — 11 笔 eth_call 并发只读检查\n - EnsureV2Ready() — 幂等修复:USDC.e→pUSD wrap(精确量 approve,\n 避免长期 MAX 给 Onramp)+ pUSD 5 spender 缺哪补哪 + CTF 4 operator\n 缺哪补哪\n - G\n[…]\n(4-stage flow + 完整代码模板 +\n 调用频率/开销表 + 安全约束)\n\n过度授权审计:所有 approve 均 V2 trading 协议必需;USDC.e→Onramp\n本次改用精确量(非 MAX),wrap 完 allowance 归零。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(v2): EnsureV2Ready 一键自检 + GetPUSDBalance + V2_GUIDE",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-28T15:00:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "df2979c35e26701cbdad484dd43af2448af8e2de",
"body": "链上行为:CTF.setApprovalForAll(0x05Cd9922a5D37faE921fc5DEe280A9dbc4C3B393, bool)。\n开启后 Polymarket 后端在市场结算后自动 redeem 用户赢家仓位。\n官方文档(含 llms-full.txt)零文档,从 tx\n0x22d6dcec5feb6bce8fdec26b86e1ee1b54aa333819aabc19d70f3006680cfd55\n反推得到。\n\n- GaslessClient.SetAutoClaim(enabled): 直发 tx\n- GaslessClient.EnableAutoClaim/\n[…]\nC.e,无 pUSD/\nadapter 路径),4-28 切换后会 redeem 出 USDC.e;V2 claimer 待 Polymarket\n公布。\n\n链上验证:enable/disable 共 5 笔 status=1;前端 ↔ SDK 状态读写一致。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(v2): Polymarket auto-claim 开关接口",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-28T03:20:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "17b0f4bb6ec49aef0dde17a78f936bbeead175e2",
"body": "V2 交易/赎回完整 SDK 路径,配合 4-28 V1→V2 切换。\n\n- web3/gasless_transaction_v2.go: SplitPosition / MergePositions /\n RedeemPositions(支持自定义 indexSets),全部走 CtfCollateralAdapter\n 长签名,collateralToken 参数仍传 USDC.e(adapter 内部桥接 pUSD)\n- web3/gasless_approvals.go: WrapAndApproveV2 扩到 9 笔(补 pUSD →\n CtfCollateralAdapte\n[…]\nollateralAdapter)\n- 9 个 V2 example 驱动 + v2_smoke 改用 poly_sec env 名\n\n链上验证:split/merge/redeem 6 笔 + ApproveAdaptersV2 1 笔均 status=1。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(v2): split/merge/redeem 全套 + adapter approves + 9 examples",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-28T03:08:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4eaafe9d6fcb5d2341124784876cae0cb0ea4693",
"body": "examples/v2_smoke/main.go\n\nStep A(只读,不花钱):\n A1 GET /time - 连通性 + 本地时钟偏差检查\n A2 余额/授权读取 - L2 HMAC 鉴权路径\n A3/A4 book + midpoint(需 POLY_V2_TEST_TOKEN)\n\nStep B(POLY_V2_SMOKE_POST=1 才跑):\n post 一笔远离中间价的 BUY,立即 cancel —— 验证 V2 签名和请求体字段名\n 失败就能定位到是 invalid signature(域分离器 / typehash)还是 400/422(字段名)",
"is_bot": false,
"headline": "feat(v2): 加 V2 联调 smoke 脚本",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-20T06:09:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "747df571237fd404e243235a963dd3233a44c87c",
"body": "WithV2() 构造选项打开后:\n- CLOB 请求发到 ClobAPIV2Domain (https://clob-v2.polymarket.com)\n- postOrdersBatch 走 V2 签名路径,调用 signing.BuildSignedV2Order\n- 请求体使用 V2 字段(timestamp/metadata/builder 替代 expiration/nonce/feeRateBps)\n- 保留 negRisk 重试模式,但 verifyingContract 换成 V2 Exchange 地址\n\nV1 默认路径完全不动。4/28 切换日前用 WithV2() 灰度联调,切换日后回落到默认。\n\n已知不确定:POST /order 的 V2 请求体字段名(salt 是否数值型、\ntimestamp 是字符串还是数值、metadata/builder 的 hex 格式)官方尚未\n正式公布,联调时遇 422 需对照 clob-v2.polymarket.com 返回。",
"is_bot": false,
"headline": "feat(v2): 订单客户端加 V2 分支",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-19T04:21:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ff0a83c747cd2fdcfca82cf40ec4d2e79fdecb5",
"body": "go-order-utils 目前只有 V1 版本(v1.22.6),不支持 V2 Order 结构\n(无 timestamp/metadata/builder;保留已废弃的 expiration/nonce/feeRateBps)。\n在本包内直接实现 V2 签名,避免等上游。\n\n- V2OrderData 输入 / V2Order 已构建 / V2SignedOrder 输出\n- BuildSignedV2Order(privKey, data, chainID, exchangeAddress)\n- V2OrderDigest 导出用于脱机验证\n- 单元测试覆盖:typehash 字符串、\n[…]\n确定性、digest 确定性、签名可 ecrecover\n\n尚未接线到 clob/orders.go(Phase 3 再做)。Polygon + V2 Exchange 的 domain\nseparator 为 0x3264e159346253e26a64e00b69032db0e7d32f94628de3e6eecb50304d7af3d2,\n待 V2 官方 TS/Py SDK 发布后交叉校验。",
"is_bot": false,
"headline": "feat(v2): 自研 V2 Order EIP-712 签名",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-19T04:18:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "14f57775641b972169a30cf78688f85cb02d2778",
"body": "CLOB 所有调用方都只用标准 POLY_* 头,builder 参数恒为 false,属于死代码:\n- CreateLevel2Headers / CreateLevel2HeadersWithBody 去掉 builder bool 参数\n- 新增 CreateRelayerHeaders 承载原先 builder=true 路径的 POLY_BUILDER_* 头\n- LocalSigner 的 relayer 鉴权分支切换到 CreateRelayerHeaders\n\n纯重构,等价变换。V2 CLOB 不再使用这套 header 鉴权(builder 分成改\n到 Order 结构的 bytes32 builder 字段),Relayer 侧的 header 行为未改动。",
"is_bot": false,
"headline": "refactor(auth): 拆分 CLOB L2 签名与 Relayer 签名",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-19T04:07:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c84e6215cc5628aa395d8ab79cca0f02a61db8e",
"body": "- 新增 V2 Exchange 地址常量(PolygonExchangeV2 / PolygonNegRiskExchangeV2)\n- 新增 ClobAPIV2Domain 用于 2026-04-28 切换前联调\n- 新增 config.API.UseClobV2 flag 与 WithUseClobV2 选项,默认关闭\n- 新增 signing/exchange_v2.go 定义 V2 EIP-712 常量(仅声明未接线)\n\nV1 路径未改动,编译通过。Order 签名实现放到 Phase 2。",
"is_bot": false,
"headline": "chore(v2): 加 V2 迁移骨架常量与 config flag",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-19T03:52:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff56ab9fb737a8a76cfe3081bae29ddbe935081c",
"body": "Relayer 的 /nonce 接口是缓存值,可能与 Safe 合约链上状态不一致\n(观察到 relayer=60 vs 链上=59 导致 GS025 revert)。签名前额外读\n一次链上 nonce,两者不一致时以链上值为准并打 WARN 日志。\n\n仅影响 Safe gasless 流(claim/split/merge),不影响 CLOB 下单。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(relay): 使用链上 safe.nonce() 校验 Relayer 返回的 nonce",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-18T11:43:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "37f630c04fbfee4110cbd279ea014ffd46fc88c6",
"body": "executeGaslessBatch 不再在失败时重试,单次失败即返回错误。\n撤销 267c0f9 引入的 3s 重试逻辑。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(relay): 移除 gasless 批量提交的重试逻辑",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-17T08:35:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9fa7b311e830027d916737e211c72a1413bfbdb4",
"body": "通过 marketID、conditionID 或 tokenID 获取对应 Polymarket 事件页 URL,\n统一走 list 端点拿到完整的 events 信息,并对已 closed 的市场做 closed=true 回退。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(gamma): add event URL builder by marketID / conditionID / tokenID",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-17T08:35:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "40d0b3e2a512bf42688566dde3eca69c744b237f",
"body": "Align market listing with Polymarket keyset pagination (`/markets/keyset`) while keeping offset-based fallback for compatibility. Also simplify market fetch APIs by defaulting `include_tag=true` and removing redundant includeTag arguments from GetMarketBySlug.\n\nMade-with: Cursor",
"is_bot": false,
"headline": "feat(gamma): switch market listing to keyset pagination by default",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-13T15:01:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7614f204c0ee806890a621267be919e4b8b90055",
"body": "Prevent connection storms under high concurrency by setting\nMaxConnsPerHost, MaxIdleConnsPerHost, IdleConnTimeout and DialContext\non the shared HTTP transport. Also reduce HTTPClientTimeout from 30s\nto 8s to match downstream handler timeouts and prevent goroutine leaks.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf: configure HTTP transport connection pool and reduce client timeout",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-04-03T09:50:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "267c0f942511fa67d33293052b370c7debe5f544",
"body": null,
"is_bot": false,
"headline": "feat(relay): 提交失败时 3s 后重试一次,再失败再返回错误",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-03-14T07:50:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5139932c07decfcb5249b0760ec086ef40948e1b",
"body": "… canceled",
"is_bot": false,
"headline": "fix(relay): getRelayNonce 在读完响应体后再 cancel context,避免 decode 时 context…",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-03-14T07:25:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8910329d936dafcf96b3a3e26ca36aa6ec262cdb",
"body": "…tionID",
"is_bot": false,
"headline": "feat(relay): 使用 RelayFailedError 返回 STATE_FAILED,便于上层获取 state/transac…",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-03-14T06:45:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b931042fb75f817293c86fa6c860b272ee907831",
"body": null,
"is_bot": false,
"headline": "chore: 移除 polygon.drpc.org 节点(eth_call 对 maxFeePerGas 等处理异常)",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-03-13T18:36:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "50289a1bd2023ea983f5d0b7f90f01c5c3b07b35",
"body": "- 循环分页请求,单次 500 条,直至取完\n- 结束条件统一为 len(markets) < pageSize\n\nMade-with: Cursor",
"is_bot": false,
"headline": "feat(gamma): GetCertaintyMarkets 分页获取全部 Certainty 市场",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-03-08T19:38:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7ec048ee422dad8695ca1156c53053815142753a",
"body": "- CLOB: add GET /prices-history, constants for staging/bridge, GetPricesHistory\n- Gamma List markets: full Market schema fields, ImageOptimization, query params\n (id/slug, liquidity/volume/date ranges, game_id, question_ids, etc.)\n- Gamma List events: full Event schema fields, Category/Collection t\n[…]\nREAKING: GetMarkets uses query 'id' (was market_ids) and 'slug' (was slugs).\nBREAKING: GetEvents uses query 'id' (was event_ids) and 'slug' (was slugs).\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "feat(api): align with Polymarket API docs, breaking changes for v2",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-19T04:52:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7e96208755a018b105644645b24cec966ebe9566",
"body": "- 移除 polygon-rpc.com(401)、polygon-mainnet.public.blastapi.io WSS(403)\n- internal/rpc_test: TestPolygonRPCMainnetList_Availability, TestPolygonWSSMainnetList_Availability\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "chore: 移除不可用 RPC/WSS 节点,新增可用性测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-19T03:57:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "616ea056c4b2a658cb4b7a3f5ac9fe2c5d351305",
"body": "- 有 WatchAddresses(1~100) 时用 topic 过滤,节点只推送相关日志\n- 未设置或超过 100 个地址时 Start 返回 ErrWatchAddrsRequired,不再全量订阅\n- 测试: 使用 rpcBalanceReader 从链上读 USDC 余额;新增 TestStartRequiresWatchAddresses\n- internal/constants: 仅格式对齐\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "feat(chainws): 服务端 topic 过滤降流量,未设 watch 地址则报错",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-12T11:42:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "540efc20239800d2f4bee3bbf3b293165a6611b4",
"body": "- chainws: 订阅 Transfer/Approval/TransferSingle,监控地址相关 USDC 与 CT 事件\n- log_info: ParseTransfer/ParseTransferSingle,解析事件\n- wallet_state: Tracker 启动拉取初仓 + WSS 增量维护,GetPositions 返回 map(仅更新时拷贝)\n- internal: 增加 PolygonWSSMainnetList / PolygonWSSAmoyList\n- PositionKeyUSDC 使用 Collateral 合约地址作为 tokenID\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "feat(chainws): 链上 WSS 订阅与钱包仓位 Tracker",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-12T08:58:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a83839e450e0b6424a9b3d30787c03456b90fdbe",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "chore(internal): 从主网 RPC 列表移除 omniatech 节点",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-11T09:03:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cef6428232b2c8021384eac5b03c07c99d5746b7",
"body": "- NewGaslessClient 增加可选参数 rpcURLs ...string,透传至 NewClient\n- 保持向后兼容\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "feat(web3): NewGaslessClient 支持自定义 RPC 节点列表",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-11T08:43:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9d1901974b9b0eda8fd9626f2e88c1f064140a38",
"body": "- NewClient 增加可选参数 rpcURLs ...string\n- 传入时使用自定义列表,未传则使用内置 Polygon 主网/Amoy 列表\n- 保持向后兼容,现有调用无需修改\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "feat(web3): 支持 NewClient 自定义 RPC 节点列表",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-02-11T08:25:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "188e384e64a2c750b9f28d85bee3e121d900a713",
"body": "- 支持多个RPC节点轮询(round-robin)\n- 自动故障转移:遇到429错误或网络错误时切换到下一个节点\n- 更新PolygonRPCMainnetList为7个已验证可用的RPC节点\n- 实现callContractWithRetry、balanceAtWithRetry等包装器方法\n- 支持EstimateGas、TransactionReceipt、TransactionByHash等方法的故障转移\n- 保持向后兼容,外部接口不变",
"is_bot": false,
"headline": "feat(web3): 添加多RPC节点轮询和故障转移支持",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-25T20:21:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6db8719e6edee1120ded53b4689bfe428f7ff57",
"body": "- 实现 SplitUSDC: 将 USDC 拆分为 outcome tokens\n- 实现 MergeTokens: 将 outcome tokens 合并回 USDC\n- 支持普通市场和 Negative Risk 市场\n- 添加完整的集成测试 (TestSplitAndMergeBTC4H)\n- 优化 ABI 编码以匹配 Rust 参考实现\n- 移除 approve 步骤,简化交易流程\n- 统一环境变量命名,使用 POLY_ 前缀\n- 更新文档:TEST_README.md 和 ENV_SETUP.md\n- 添加 .env.example 示例配置文件\n\n功能已验证可用,测试通过。",
"is_bot": false,
"headline": "feat(web3): 实现 Split 和 Merge 功能",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-22T17:02:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d9bf2697b8888521c8a5ec567808684315f6233",
"body": null,
"is_bot": false,
"headline": "docs: 更新测试文档",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "841a7282a4ee542d947118cd7187c42ac59602ff",
"body": null,
"is_bot": false,
"headline": "test(integration): 添加集成测试模块",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4c1159a998ec843f4fd2e4dc1fb0ee063742776",
"body": null,
"is_bot": false,
"headline": "docs(examples): 更新基础使用示例",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cba64efa1c97074f2e45dad572c22412b3990b40",
"body": "- 添加client_test.go测试\n- 添加sports_client_test.go测试",
"is_bot": false,
"headline": "test(websocket): 扩展websocket模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b712bbdfc33eec738a6bfb6881e3f55f6c8b98c",
"body": "- 添加client_test.go测试\n- 添加gasless_test.go测试",
"is_bot": false,
"headline": "test(web3): 扩展web3模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bcfbb564492fae681ce84c6dea33e866ebdafbe5",
"body": null,
"is_bot": false,
"headline": "test(subgraph): 扩展subgraph模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "29be9aa40e34b007aea2eeb9b486010a7bd817f9",
"body": null,
"is_bot": false,
"headline": "test(rtds): 扩展rtds模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9eae9be05b9a2f28d5eba323851f428ea4f09e1e",
"body": null,
"is_bot": false,
"headline": "test(rfq): 扩展rfq模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cd5069119cdb08971a4ac3d791505afe9d123eed",
"body": null,
"is_bot": false,
"headline": "test(gamma): 扩展gamma模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23a932bd0bc03d53952d615d5c2ef287eb39f578",
"body": null,
"is_bot": false,
"headline": "test(data): 扩展data模块测试",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b763be31c4ec79d510320e6f7640c3d2e87cff36",
"body": null,
"is_bot": false,
"headline": "test: 更新测试辅助函数",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e7ff91bfe8662893cd52d1a99a01c4bbaa036a45",
"body": "- 更新client.go,添加新功能\n- 扩展market_data.go,添加更多市场数据支持\n- 添加rewards.go,实现奖励相关功能\n- 扩展测试覆盖,包括只读和读写测试",
"is_bot": false,
"headline": "feat(clob): 增强CLOB模块功能",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93993655ab80e526b227ad9b7dd76d5d509caa30",
"body": null,
"is_bot": false,
"headline": "fix(http): 更新http客户端",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0d0247d620cb82b7067be2f44642327db6fe25b",
"body": "- 添加clob_types.go中的新类型\n- 添加data_types.go中的新类型\n- 添加gamma_types.go中的新类型",
"is_bot": false,
"headline": "feat(types): 添加新的类型定义",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T17:43:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2139ed67a5514b4af48b3e576d44195bad8b1298",
"body": "- 重构 clob/order_utils.go 中的纯函数为包级函数(roundNormal, roundDown, roundMakerAmount等)\n- 重构 types/clob_types.go 中的 ApiCreds.Clear() 为包级函数 ClearApiCreds()\n- 重构 types/gamma_types.go 中的 GammaMarket 方法为包级函数(GetOutcomePrices, GetOutcomeNames, HasDispute)\n- 更新所有调用这些方法的地方\n- 更新 Go skill 文件,添加方法 vs 函数选择原则:\n * 改变结构体内部状态 -> 使用结构体方法\n * 不改变结构体内部状态 -> 使用包级函数\n * 标准接口方法必须保持为方法(String, UnmarshalJSON等)",
"is_bot": false,
"headline": "refactor: 将不改变状态的方法改为包级函数",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:59:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a10d0457734099900d8324473086eebf7b68593b",
"body": null,
"is_bot": false,
"headline": "docs: 更新README,移除已删除的container和cache模块示例",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:53:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3d763a3442eb530e20b6373044f36390eb949816",
"body": "- 将大的Client接口拆分为多个轻量接口(OrderClient, MarketDataClient, AccountClient, APIKeyClient, RewardClient)\n- 通过组合方式实现接口耦合,提高代码可维护性\n- 实现类通过组合各个功能模块实现\n- 删除未使用的container和cache模块\n- 添加开发和测试记录文档(DEVELOPMENT_LOG.md)",
"is_bot": false,
"headline": "refactor: 重构CLOB接口为轻量组合式设计",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:53:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b8fe8dde6bdb002191fac0ab26d268e9272afba",
"body": "- Add ARCHITECTURE_REFACTOR.md: detailed architecture refactoring guide\n- Add README.md: project usage guide with API interface tables\n- Add REFACTOR_SUMMARY.md: summary of refactoring changes\n- Add TEST_README.md: testing documentation",
"is_bot": false,
"headline": "docs: add architecture refactoring documentation",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:30:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "281fa4b4262ab3f37f4436b44c706f3ec1831277",
"body": "- Add examples/ directory with basic usage example\n- Add test/ directory with test helpers\n- Add .gitignore file",
"is_bot": false,
"headline": "feat: add examples, tests, and gitignore",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:30:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eca3a2c1722b0a0b2bbc88a21641bfb805dff9cf",
"body": "- Add data/ client module\n- Add web3/ client module (client.go, local_signer.go)\n- Add rfq/ client module\n- Add rtds/ client module\n- Add subgraph/ client module\n- All modules include test files\n- These clients follow the new modular architecture",
"is_bot": false,
"headline": "feat: add refactored client modules",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:30:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d016a3448468b0f86d97ef872cddb5c1211d9bdf",
"body": "- Add cache/ module for caching functionality\n- Add config/ module for configuration management\n- Add container/ module for dependency injection\n- Add errors/ module for enhanced error handling\n- Add middleware/ module for HTTP middleware (retry, logging, timeout)\n- Add http/ module for HTTP client abstraction\n- These modules provide the foundation for the refactored architecture",
"is_bot": false,
"headline": "feat: add architecture refactoring modules",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:30:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "29359d5ce97da3fde73b9c28ed48773eddde6fc3",
"body": "- Remove old client/ directory files (clob_client.go, data_client.go, gamma_client.go, etc.)\n- Update type definitions in types/ (clob_types.go, data_types.go, gamma_types.go)\n- Update constants in internal/constants.go\n- These files have been refactored into new modular structure",
"is_bot": false,
"headline": "refactor: remove old client directory and update type definitions",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:30:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0885b9cb377d2cdf842f85d486d1c8b4299b284d",
"body": "- Split web3/gasless.go into multiple files by functionality:\n - gasless_signature.go: Signature-related methods and type definitions (SignatureParams, ProxyRelayBody, SafeSignatureParams, SafeRelayBody, signSafeTransaction, getSafeProxyAddress, getSafeABI)\n - gasless_transaction.go: Transaction-r\n[…]\ngasless.go with only struct definition, constructor, and ABI helper functions (getConditionalTokensABI, getNegRiskAdapterABI, getProxyFactoryABI)\n- All files compile successfully with no linter errors",
"is_bot": false,
"headline": "refactor: split Gasless client into modular files",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:29:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3984bd388964c06491b88df61a7b5a0725dcbaee",
"body": "- Split websocket/client.go into multiple files by functionality:\n - connection.go: Connection management methods (Start, Stop, IsRunning, run, connectAndListen, StartUserChannel, StopUserChannel, heartbeat)\n - subscription.go: Subscription management methods (UpdateSubscription, SubscribeAssets, \n[…]\nlient.go with only interface, struct definition, constructor, and callback setters (SetOnBookUpdate, SetOnOrderUpdate, SetOnTradeUpdate, SetAuth)\n- All files compile successfully with no linter errors",
"is_bot": false,
"headline": "refactor: split WebSocket client into modular files",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:29:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "24c809ca0663d1eb386102c0a781d1ff9e106cc5",
"body": "- Split gamma/client.go into multiple files by functionality:\n - markets.go: Market data methods (GetMarket, GetMarkets, GetMarketsByConditionIDs, etc.)\n - events.go: Event data methods (GetEvent, GetEventBySlug, GetEvents)\n - search.go: Search functionality (Search)\n - tags.go: Tag methods (Get\n[…]\nent)\n - profiles.go: Profile methods (GetProfile, GetProfileByUsername)\n- Keep client.go with only interface, struct definition, and constructor\n- All files compile successfully with no linter errors",
"is_bot": false,
"headline": "refactor: split Gamma client into modular files",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:29:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8c130581e225cd17e9ed092b6d923f832bc207e5",
"body": "- Split clob/client.go into multiple files by functionality:\n - orders.go: Order management methods (CreateAndPostOrders, PostOrder, CancelOrders, etc.)\n - market_data.go: Market data methods (GetOrderBook, GetMidpoint, GetPrice, etc.)\n - account.go: Account management methods (GetUSDCBalance, Ge\n[…]\ntions (ResolveTickSize, createSignedOrder, etc.)\n- Keep client.go with only interface, struct definition, constructor, and CreateOrDeriveAPICreds\n- All files compile successfully with no linter errors",
"is_bot": false,
"headline": "refactor: split CLOB client into modular files",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T14:29:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "650522ed4eb3b9b855f100fd077f6a5214b46b6b",
"body": null,
"is_bot": false,
"headline": "docs: 添加 signing 包使用文档",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T11:01:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9e8e8ed4fa5f62583e0fcfed0c4d4560fbea648a",
"body": "- 将 internal/signing 移动到 signing 包,使外部可以使用\n- 更新所有导入路径\n- Signer 现在可以通过 github.com/polymas/go-polymarket-sdk/signing 导入",
"is_bot": false,
"headline": "refactor: 将 Signer 从 internal 移动到公共 signing 包",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T11:01:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b7b60c49bf4e2ca95cb2852baca3057733db090",
"body": null,
"is_bot": false,
"headline": "docs: 添加 go-polyapi 项目修复指南",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:41:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "287779b27b61bcc24ef0d3097148442891cbc7e0",
"body": null,
"is_bot": false,
"headline": "docs: 添加模块路径迁移指南",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:32:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9a2f90e975c56a8ad7a712cbb6c024073892987",
"body": "- 修复 go.mod 中的模块路径\n- 更新所有 Go 文件中的导入路径\n- 匹配实际的 GitHub 仓库路径",
"is_bot": false,
"headline": "fix: 更新模块路径为 github.com/polymas/go-polymarket-sdk",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:29:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ce71994a7426123ce4ed600eea7a7c7984511a7",
"body": "- 添加所有客户端实现文件\n- 添加内部工具和类型定义\n- 添加依赖管理文件\n- 添加常量定义和日志模块",
"is_bot": false,
"headline": "chore: 添加项目基础文件",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:20:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d994c1de6a88cd9b72f595e91d38e68be8b7135",
"body": "- 完整的代码安全审计报告\n- 包含所有发现的安全问题和修复建议\n- 安全最佳实践建议",
"is_bot": false,
"headline": "docs: 添加安全审计报告",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:19:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1992a1d52c484dfe4f3c6db064b1b331c7e4597b",
"body": "- 移除日志中的价格和数量等敏感信息\n- 限制错误日志长度,避免泄露完整响应体\n- 防止敏感信息通过日志泄露",
"is_bot": false,
"headline": "security: 模块6 - 日志安全增强",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:19:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97a4fa53f8e155fa916c1fa26f7de6bfa592fc97",
"body": "- ValidateEthAddress() - 验证以太坊地址格式\n- ValidateKeccak256() - 验证Keccak256哈希格式\n- ValidateLimitOffset() - 验证分页参数范围\n- ValidatePriceRange() - 验证价格范围\n- 防止无效输入和注入攻击",
"is_bot": false,
"headline": "security: 模块4 - 添加输入验证工具函数",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:19:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4d8885c95848f212fef83e07e7cba539c27410da",
"body": "模块3 - TLS和URL验证:\n- 添加TLS配置,强制最低TLS 1.2版本\n- 实现buildSafeURL()函数防止SSRF攻击\n- 所有URL构建都通过安全验证\n\n模块5 - 错误处理:\n- 实现sanitizeErrorResponse()函数清理敏感信息\n- 自动移除错误响应中的敏感字段\n- 限制错误信息长度,防止信息泄露",
"is_bot": false,
"headline": "security: 模块3和5 - HTTP客户端安全增强",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:19:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9564beb2ca42572e5fe7fe83607ad8f3bd25aa2c",
"body": "- 为 ApiCreds 结构体添加 Clear() 方法\n- 清理 Key、Secret、Passphrase 等敏感字段\n- 防止敏感信息在内存中残留",
"is_bot": false,
"headline": "security: 模块2 - 实现API凭证清理机制",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:19:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "671144379da06d94253b3d5a72b691ee425afa00",
"body": "- 添加 Signer.Clear() 方法用于清理私钥内存\n- 实现 zeroBigInt() 辅助函数清零敏感数据\n- 防止内存转储攻击",
"is_bot": false,
"headline": "security: 模块1 - 实现私钥内存清理机制",
"author_name": "web3chong",
"author_login": "0xachong",
"committed_at": "2026-01-19T10:19:46Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 54,
"commits_last_year": 94,
"latest_release_at": "2026-07-20T11:07:52Z",
"latest_release_tag": "v1.12.5",
"releases_from_tags": true,
"days_since_last_push": 7,
"active_weeks_last_year": 15,
"days_since_latest_release": 7,
"mean_days_between_releases": 6.3
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": false,
"has_contributing": false,
"health_percentage": 25,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/polymas/go-polymarket-sdk",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/polymas/go-polymarket-sdk",
"is_deprecated": false,
"latest_version": "v1.12.5",
"repository_url": "https://github.com/polymas/go-polymarket-sdk",
"versions_count": 58,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-20T11:07:52Z",
"latest_version_yanked": null,
"days_since_latest_publish": 7
}
]
},
"popularity": {
"forks": 1,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-01-28",
"count": 1
}
],
"complete": true,
"collected": 1,
"total_forks": 1
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 38706,
"source_files_sampled": 120,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/ethereum/go-ethereum",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.14.0"
},
{
"name": "github.com/gorilla/websocket",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.4.2"
},
{
"name": "github.com/polymarket/go-order-utils",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.22.6"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "0xachong",
"commits": 94,
"avatar_url": "https://avatars.githubusercontent.com/u/160319530?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 9,
"reason": "binaries present in source code",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "26 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "24 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "d5610992b60cac471755e7322f1f782ecd469ce1",
"ran_at": "2026-07-28T00:31:52Z",
"aggregate_score": 2.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-20T11:08:18Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/polymas/go-polymarket-sdk",
"host": "github.com",
"name": "go-polymarket-sdk",
"owner": "polymas"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 38,
"inputs": {
"security": 21,
"vitality": 80,
"community": 12,
"governance": 32,
"engineering": 34
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 80,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 74,
"inputs": {
"commits_last_year": 94,
"human_commit_share": 1,
"days_since_last_push": 7,
"active_weeks_last_year": 15
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 7 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 7
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "15/52 weeks with commits",
"points": 10.4,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 15
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "94 commits in the last year",
"points": 17.8,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 94
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "26 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 88,
"inputs": {
"releases_count": 54,
"latest_release_tag": "v1.12.5",
"releases_from_tags": true,
"days_since_latest_release": 7,
"mean_days_between_releases": 6.3
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "54 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 54
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 7 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 7
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~6.3 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 6.3
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 7,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 7 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 7
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 12,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 1,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 1
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "critical",
"name": "Community health",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"has_readme": true,
"has_license": false,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 32,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 37,
"inputs": {
"followers": 0,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "polymas",
"public_repos": 5,
"account_age_days": 221
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "0 followers of polymas",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "polymas"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "5 public repos, account ~0 yr old",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 5
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/polymas/go-polymarket-sdk"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 7
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 7 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 7
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "58 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 58
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 34,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "at_risk",
"name": "Documentation",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 21,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 21,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 2.1
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "binaries present in source code",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "26 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "24 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 65,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "94 of 94 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 94,
"sampled": 94
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 79,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.436,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "41 of the last 94 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 41,
"sampled": 94
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 38706,
"source_files_sampled": 120,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/120 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 120,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T00:31:58.420084Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/polymas/go-polymarket-sdk.svg",
"full_name": "polymas/go-polymarket-sdk",
"license_state": "absent",
"license_spdx": null
}