总 PR
31
HIGH
7
MEDIUM
6
Stage2
12
Model: none Back

交叉验证

两边确认0
仅分析映射31
仅 Release Notes0
HIGH 重要更新 (7)
#2412 Improve dissolve network process MERGED feature
将子网销毁(dissolve network)的存储清理从单次 extrinsic 同步删除改为由 on_idle hook 分阶段异步清理,并引入网络注册队列(NetworkRegistrationQueue)支持当子网数达上限时排队等待清理完成后再注册。
判级:新增 on_idle hook 实现分阶段异步销毁机制,修改溶解网络核心流程;新增 4 个存储项并修改 CommitmentsInterface trait 签名,spec_version 升级,涉及 TAO/Alpha 资金处理和共识存储变更。
关键改动
  • pallets/subtensor/src/subnets/dissolution.rs(新增 ~997 行):定义 DissolveCleanupPhase 枚举(25 个阶段)和 DissolveCleanupStatus 结构体,实现 do_dissolve_network(仅标记移除 + 入队)、remove_data_for_dissolved_networks(on_idle 入口)、clean_up_data_for_one_dissolved_network(阶段调度器)、以及各阶段清理函数(root dividends、alpha 销毁、TAO 分配、lock 清理、subnet 参数、map 参数、权重、childkey 等)
  • pallets/subtensor/src/subnets/subnet.rs:add_network 改为先检查清理队列容量,若子网数+清理队列 >= 上限则将注册信息入队 NetworkRegistrationQueue 并锁定注册费(lock_amount),待 on_idle 清理出 netuid 后处理队列;新增 set_new_network_state 作为实际创建子网的独立函数(带 weight 返回值),可被排队注册和直接注册共用
  • pallets/subtensor/src/staking/remove_stake.rs:将 destroy_alpha_in_out_stakes 拆分为 6 个带 checkpoint 的子阶段函数(get_total_alpha_value / settle_stakes / clean_alpha / clear_hotkey_totals / clear_locks / clear_decaying_locks),均使用 WeightMeter 限制每次迭代的权重消耗
  • pallets/subtensor/src/macros/hooks.rs:新增 on_idle hook,优先调用 remove_data_for_dissolved_networks 清理已销毁子网,若有余量则处理注册队列 process_network_registration_queue
  • pallets/subtensor/src/lib.rs:新增存储项 DissolveCleanupQueue、CurrentDissolveCleanupStatus、NetworkRegistrationQueue、NetworkRegistrationLockId;新增事件 NetworkDissolveCleanupCompleted、NetworkRegistrationQueued;新增错误 NetworkDissolveAlreadyQueued、WaitingForDissolvedSubnetCleanup、LockIdOverFlow;CommitmentsInterface::purge_netuid 签名变更为带 WeightMeter
  • common/src/lib.rs:新增 clear_prefix_with_meter 工具函数(按 WeightMeter 预算分批清理 storage prefix)
  • runtime/src/lib.rs:spec_version 从 426 升至 427;适配 CommitmentsInterface 新签名;CanCommit 增加 if_subnet_exist 检查
  • pallets/commitments/src/lib.rs:purge_netuid 适配新签名(带 WeightMeter),支持分步清理
  • pallets/subtensor/src/staking/lock.rs:修改 destroy_lock_maps 及相关函数,融入清理流程
  • pallets/subtensor/src/subnets/subnet.rs:get_next_netuid 跳过清理队列中的 netuid;get_subnet_account_id 对清理队列中的 netuid 也返回账户 ID(确保销毁期间子网账户可访问)
  • 各测试文件(~2000+ 行新增):新增 dissolution.rs、cleanup_tests.rs、destroy_alpha_tests.rs、remove_data_tests.rs 等,覆盖销毁流程各阶段和注册队列场景
#2777 remove duplicate sudo_set_subnet_owner_hotkey BREAKING MERGED runtime
删除 admin-utils pallet 中重复的 sudo_set_subnet_owner_hotkey 外部调用
判级:删除的安全漏洞修复(GHSA-2026-003),重复别名允许绕过 Proxy 对 sudo_set_sn_owner_hotkey 的排除限制,属于直接影响链上安全的关键改动。
关键改动
  • pallets/admin-utils/src/lib.rs:删除 sudo_set_subnet_owner_hotkey 外部调用(原 call_index 64),并注释掉相关代码块
  • runtime/src/lib.rs:从 Proxy 过滤器 except 列表中移除 AdminUtils::sudo_set_subnet_owner_hotkey(因该变体已不存在)
  • runtime/tests/ghsa_repro.rs:删除测试函数 set_subnet_owner_hotkey_c64 及其在 GHSA-2026-003 测试中的断言
  • runtime/src/lib.rs:spec_version 从 421 提升至 422(因运行时元数据变更)
#2778 BlockEmission RPC BREAKING emission MERGED feature
将区块排放值从每块持久化存储改为通过自定义 RPC 按需计算返回
判级:直接改动 emission 核心路径:移除 calculate_block_emission() 中的存储写入逻辑,改变了每个区块 emission 值的持久化策略,且包含 spec_version 升级
关键改动
  • pallets/subtensor/rpc/src/lib.rs:新增 subnetInfo_getBlockEmission RPC 方法声明与实现,调用运行时 API
  • pallets/subtensor/runtime-api/src/lib.rs:在 SubtensorRuntimeApi trait 中新增 get_block_emission() 函数签名
  • runtime/src/lib.rs:实现 get_block_emission() 运行时 API,调用 SubtensorModule::calculate_block_emission(),返回 TaoBalance
  • pallets/subtensor/src/coinbase/block_emission.rs:从 calculate_block_emission() 中移除 BlockEmission 存储写入逻辑(if/put 块)
  • pallets/subtensor/src/lib.rs:为 BlockEmission 存储类型添加 #[deprecated] 属性,提示改用 calculate_block_emission() 或新的 RPC
  • runtime/src/lib.rs:spec_version 从 422 升至 423
#2786 Fix crowdloan reentrancy bug BREAKING MERGED fix
修复 crowdloan pallet 的重入漏洞,通过调整 finalize 调用顺序并添加嵌套 finalize 守卫。
判级:修改核心 finalize 逻辑,直接影响 crowdloan 锁定资金的转移安全,属于安全关键修复;spec_version 也随之升级。
关键改动
  • pallets/crowdloan/src/lib.rs: 在 finalize extrinsic 中,将 crowdloan.finalized 的写入从 call 执行后移到执行前,使得重入调用立即触发 AlreadyFinalized 错误
  • pallets/crowdloan/src/lib.rs: 新增 AlreadyFinalizing 错误,在 finalize 开始时检查 CurrentCrowdloanId 是否已设置,防止嵌套 finalize
  • pallets/crowdloan/src/tests.rs: 新增三项回归测试:嵌套 finalize 被拒、重入 withdraw 被拒、重入 refund 被拒
  • runtime/src/lib.rs: spec_version 从 423 提升到 424,对应 pallet 变更
#2800 Enforce conviction BREAKING emission MERGED consensus
启用 conviction 强制所有权变更,并从 emission 计算中移除 root_prop
判级:包含 emission 核心逻辑变更(root_prop 移除)和 spec_version 升级,属于资金排放和共识关键改动
关键改动
  • pallets/subtensor/src/coinbase/run_coinbase.rs:取消注释 Self::change_subnet_owner_if_needed(netuid) 调用,在每次 epoch 运行时激活 conviction 所有权变更逻辑
  • pallets/subtensor/src/coinbase/subnet_emissions.rs:get_shares 函数中移除 root_prop 乘数因子,emission 分配仅由 price * (1 - miner_burned) 决定
  • pallets/subtensor/src/tests/locks.rs:新增 test_run_coinbase_reassigns_subnet_owner_by_conviction_on_epoch 测试,验证满足条件时所有权从 old_owner 转移到高 conviction 的 king_hotkey
  • pallets/subtensor/src/tests/subnet_emissions.rs:新增 get_shares_ignores_root_prop_storage_when_prices_and_burns_match 测试,验证 root_prop 存储值不再影响 share 计算
  • runtime/src/lib.rs:spec_version 从 424 升级到 425
#2802 Proxy deny by default BREAKING MERGED feature
将代理调用过滤从黑名单(denylist)模式重构为加性白名单(additive allow-list)模式,新增 call_filter_group! 宏统一生成过滤器和元数据,按 dispatch 守卫严格拆分 AdminUtils 调用
判级:完全重写 proxy 核心安全模型(deny-by-default),新增 2000+ 行关键代码,涉及 Runtime API breaking change 和数据模型重构,影响所有代理用户的安全假设
关键改动
  • support/macros/src/: 删除旧 proxy_filter.rs(540行),新增 call_filter_group.rs(398行)实现新宏,lib.rs 入口切换
  • runtime/src/proxy_filters/call_groups.rs(新增780行):声明所有 runtime 调用的 call_filter_group,按功能拆分为 30+ 个组,包括条件组 SmallTransferCalls/SudoSetCodeCalls
  • runtime/src/proxy_filters/mod.rs(新增654行):每个 ProxyType 定义为若干 call_group 的加性联合,实现 InstanceFilter 和 Runtime API 元数据,含 superset 一致性测试
  • runtime/src/lib.rs: 删除旧 define_proxy_filters! 宏调用和辅助函数(-248行),改用 proxy_filters 模块;Runtime API 签名从 get_proxy_filter(Option<u8>) 改为 get_proxy_filters(Option<Vec<u8>>)
  • common/src/: 将 ProxyType/CallInfo/FilterMode/ProxyFilterInfo 等类型从 lib.rs 分离到新 proxy.rs(219行),简化 FilterMode 为 AllowAll/Allow 两种变体,去除 old DenyAll/Deny/except 字段
  • runtime/tests/pallet_proxy.rs(删除715行旧集成测试),测试迁移至 mod.rs 和 call_groups.rs 内的单元测试
#2814 Backport hotfixes 29-06-2026 BREAKING MERGED fix
将三个hotfix反向移植到devnet-ready分支,包括balancer性能优化、冷密钥交换锁定Alpha修复和条件性调度扩展。
判级:该PR将多个已合并的hotfix(#2803、#2810、#2812)反向移植到devnet-ready分支,包含balancer性能优化、冷密钥交换锁定Alpha修复、条件性调度扩展等实质性代码变更,涉及swap逻辑、锁定资产操作和交易前置验证,影响链上状态和交易行为。
MEDIUM 更新 (6)
#2570 Charge hotkey-origin fees to the owning coldkey MERGED feature
在交易费用包装器中新增冷键代付机制:当 hotkey 签名的特定调用(权重设置、commit/reveal、serve 等)拥有归属 coldkey 时,协议费用从该 coldkey 扣除,签名的 hotkey 仅提供 tip(tip 被置零)。当前所有目标调用仍为 Pays::No,无实际经济效果。
判级:改动涉及核心交易费用支付机制(TransactionExtension),但当前所有目标调用仍为 Pays::No,无实际资金流动,且无 spec_version 升级或存储迁移,不直接影响共识/排放。
关键改动
  • runtime/src/fee_filters.rs:新建文件,通过 call_filter_group! 枚举 17 个 coldkey 代付的调用变体(set_weights 系列、commit 系列、reveal 系列、serve_axon、serve_axon_tls、serve_prometheus、associate_evm_key、set_commitment),并实现 ColdkeyFeeCallFilter trait。
  • runtime/src/transaction_payment_wrapper.rs:引入 ColdkeyFeeCallFilter trait;新增 extract_coldkey_fee_payer 方法,根据调用是否在过滤列表且 hotkey 有 owner 返回 Some(coldkey);在 validate 中修改 fee 解析逻辑:RealPaysFee 优先,否则若符合条件则使用 coldkey 作为 fee_origin 并将 tip 置零(防止 hotkey 用 tip 消耗 coldkey);重构测试为内联 mod tests。
  • pallets/subtensor/src/rpc_info/delegate_info.rs:新增 maybe_coldkey_for_hotkey 方法,返回 Option<AccountId>,供 fee 检测使用。
  • runtime/tests/transaction_payment_wrapper.rs:删除,测试已集成到 transaction_payment_wrapper 的内联测试模块。
  • runtime/src/lib.rs:添加 mod fee_filters 声明。
  • ts-tests/utils/dev-helpers.ts:导入 tao 并设置 devForceSetBalance 的默认金额。
#2727 Remove rate limits for hotkey/coldkey swaps BREAKING MERGED feature
移除 hotkey 和 coldkey 互换操作中的 1 区块速率限制
判级:修改了 hotkey/coldkey swap 核心逻辑(移除速率限制),变更了用户行为约束,且 bump spec_version 需同步升级运行时;但未触及资金、共识或 emission 等高风险区域
关键改动
  • pallets/subtensor/src/swap/swap_coldkey.rs: 删除 swap_coldkey 末尾的 set_last_tx_block(new_coldkey, ...) 调用(2行删除)
  • pallets/subtensor/src/swap/swap_hotkey.rs: 删除 do_swap_hotkey 中的速率限制检查(exceeds_tx_rate_limit + HotKeySetTxRateLimitExceeded 错误);删除 LastTxBlock 从旧 hotkey 拷贝到新 hotkey 的逻辑;删除冷 key 的 set_last_tx_block 写入;调整权重计算(减少读写计费);更新注释
  • pallets/subtensor/src/swap/swap_hotkey.rs: swap_hotkey_on_subnet 中删除 set_last_tx_block(coldkey, block),仅保留 LastHotkeySwapOnNetuid 的插入(减少 1 次写入计费)
  • pallets/subtensor/src/tests/swap_hotkey.rs: 测试 test_swap_hotkey_tx_rate_limit_exceeded 改名为 test_swap_hotkey_no_tx_rate_limit,移除断言速率限制失败的逻辑,验证第二次互换在仅满足子网冷却间隔后成功;test_swap_hotkey_swap_rate_limits 移除 LastTxBlock 的赋值和断言
  • pallets/subtensor/src/tests/swap_hotkey_with_subnet.rs: 删除整个 test_swap_hotkey_tx_rate_limit_exceeded 测试;test_swap_hotkey_swap_rate_limits 移除 LastTxBlock 的赋值和断言
  • runtime/src/lib.rs: spec_version 从 423 升至 424
#2815 Remove registry pallet cleanup migration MERGED runtime
移除已完成的一次性Registry Pallet清理迁移代码及相关模块
判级:虽然 spec_version bump 使该变更为 breaking,但改动仅移除已完成的一次性迁移,未新增功能或修改核心资金/共识/emission 逻辑,属于常规清理
关键改动
  • runtime/src/lib.rs: 删除 mod migrations; 声明
  • runtime/src/lib.rs: 从 Migrations 元组中移除 migrations::PalletRegistryCleanupMigration
  • runtime/src/lib.rs: spec_version 从 423 提升到 424
  • runtime/src/migrations/mod.rs: 删除整个文件(仅用于暴露该迁移)
  • runtime/src/migrations/pallet_registry_cleanup_migration.rs: 删除 543 行迁移实现及测试
#2830 Make `uidLookup` O(1) and bound its cost BREAKING MERGED fix
为 EVM 地址关联的 UID 查询添加反向索引,将 uid_lookup 从 O(n) 扫描优化为 O(1) 单次读取,并限制每个 EVM 地址最多关联 32 个 UID
判级:优化 uid_lookup 预编译的性能和正确性,新增存储项和迁移,但不触及资金/共识/emission 核心逻辑,属于基础设施优化
关键改动
  • pallets/subtensor/src/lib.rs: 新增存储项 AssociatedUidsByEvmAddress,类型为 StorageDoubleMap<(netuid, H160) -> BoundedVec<(uid, block), 32>>,作为反向索引
  • pallets/subtensor/src/lib.rs: 新增常量 MAX_ASSOCIATED_UIDS_PER_EVM_ADDRESS = 32,限制每个 EVM 地址最多关联的 UID 数
  • pallets/subtensor/src/utils/evm.rs: 重写 uid_lookup 为单次存储读取 + 排序截断,O(1);新增 set_associated_evm_address、remove_associated_evm_address、clear_associated_evm_addresses、remap_associated_evm_address_index 等辅助函数,保持正反向索引一致
  • pallets/subtensor/src/utils/evm.rs: 新增 ensure_evm_address_index_capacity 检查,防止单个 EVM 地址关联超过 32 个 UID
  • pallets/subtensor/src/lib.rs: 新增存储项 AssociatedUidsByEvmAddress 和常量 MAX_ASSOCIATED_UIDS_PER_EVM_ADDRESS = 32
  • pallets/subtensor/src/macros/errors.rs: 新增错误 EvmKeyAssociationLimitExceeded
  • pallets/subtensor/src/migrations/migrate_associated_evm_address_index.rs: 新增一次性迁移,从现有正向映射回填反向索引,处理超限关联的剪枝
  • pallets/subtensor/src/macros/hooks.rs: 在 on_runtime_upgrade 中注册新迁移
  • pallets/subtensor/src/subnets/uids.rs: replace_neuron 和 trim_to_max_allowed_uids 中改用新的 remove_associated_evm_address 和 remap_associated_evm_address_index 以保持反向索引一致
  • pallets/subtensor/src/coinbase/root.rs: 子网解散时改用 clear_associated_evm_addresses 同时清理正反向索引
  • precompiles/src/uid_lookup.rs: 预编译 gas 计费从 record_db_reads(limit) 改为 record_db_reads(1),反映 O(1) 查询
  • pallets/subtensor/src/tests/evm.rs: 新增测试覆盖容量限制、刷新、切换地址等场景
  • pallets/subtensor/src/tests/migration.rs: 新增迁移测试,包括超限桶的协调处理
  • pallets/subtensor/src/tests/uids.rs、networks.rs、admin-utils/src/tests/mod.rs: 更新现有测试以使用新的 setter/remover 并验证反向索引一致性
#2846 bittensor-core: one Rust core (keys, keyfiles, timelock, codec, RFC-0078 digest, Ledger) under a thin Python SDK MERGED feature
将 bittensor 核心功能(密钥、编解码、签名等)迁移至 Rust,通过 PyO3 绑定 Python SDK,API 不变。
判级:将 Python SDK 的核心功能(密钥、编解码、签名等)以 Rust 重写并集成到 bittensor-core 中,属于基础设施重大重构,但未修改链上 runtime、共识或资金逻辑。
#2867 feat: typed currency units through runtime metadata and SDK BREAKING MERGED feature
合并主分支:带类型货币单位元数据、CI修复、drand修复及依赖更新
判级:集合型PR,合并了typed currency units(元数据增强,不影响链上逻辑)、CI修复、drand round skip修复(spec_version bump)和依赖更新。核心逻辑未变,无资金/共识影响。
LOW (18)
#2797 add 3 more Ink interface MERGED feature
在ts-tests中新增3个Ink合约接口的测试用例,已合并至devnet-ready分支。
判级:该PR在ts-tests中添加了3个Ink合约查询接口的测试用例,无链上逻辑变更,不影响运行时或共识。
#2811 Fix bad start call error name BREAKING MERGED fix
修复 do_start_call 返回的错误名称拼写错误,新增正确的 StartCallNotReady 错误变体,并提升 spec_version。
判级:纯错误名称修正,无逻辑变更,不触及资金/共识/存储/emission,仅影响运行时元数据。
关键改动
  • pallets/subtensor/src/macros/errors.rs: 新增错误变体 StartCallNotReady。
  • pallets/subtensor/src/subnets/subnet.rs: do_start_call 中返回的错误从 NeedWaitingMoreBlocksToStarCall 改为 StartCallNotReady。
  • runtime/src/lib.rs: spec_version 从 423 升至 424,因运行时元数据/错误接口变更。
#2816 Fix try-runtime in CI MERGED ci
替换外部try-runtime CI动作为本地自定义复合动作,修复CI中的try-runtime检查
判级:纯CI/工作流改进,替换外部try-runtime动作为本地自定义动作,不涉及运行时、存储、共识或资金逻辑变更
#2820 add finalize after contract deploy MERGED fix
在EVM合约部署测试后添加finalize操作,修复CI中偶发的测试失败
判级:仅为ts-tests中EVM合约部署后添加finalize调用,修复CI偶发测试失败,不涉及任何链上状态或核心逻辑
#2834 Org migration: update references for RaoFoundation MERGED chore
完成 opentensor 到 RaoFoundation 组织迁移的代码引用、CI 和 Docker 镜像更新
判级:此 PR 仅完成组织迁移的引用更新(URL、元数据、CI、Docker 镜像),不涉及任何链上状态、共识或资金逻辑变更,且为非破坏性变更。
#2840 Fix website monorepo cleanup regressions MERGED chore
修复网站Monorepo清理后的回归问题,包括docs触发、lint修复和移除未使用的API路由
判级:纯网站Monorepo清理回归修复,仅涉及docs触发、lint、移除未使用的API路由和工作区包,不触及链上逻辑、共识、资金或运行时
#2852 ci: path-filter heavy workflows + build-once/fan-out runtime checks MERGED ci
优化CI工作流,为8个耗时流程添加路径过滤和构建复用,仅在rust/pallets变更时触发完整CI。
判级:纯CI流程优化,无链上状态或逻辑变更,仅调整工作流触发条件和构建策略。
#2857 ci: accelerate Subtensor CI with R2 sccache and tiered Fireactions pools MERGED ci
通过R2共享缓存和多层级Fireactions加速CI编译
判级:纯CI基础设施改进(sccache缓存、Fireactions runner分层),不涉及任何链上逻辑、共识、经济或pallet变更
#2866 sdk: declare readme and point Documentation at bittensor.com/docs MERGED docs
为 SDK Python 包添加 readme 声明和文档链接,改进 PyPI 展示。
判级:仅更新 SDK Python 包元数据(readme 声明和文档链接),无代码逻辑变更,不影响链上行为或核心功能。
#2868 ci: fix first-run failures in the bittensor-core wheel matrix MERGED ci
CI修复:解决bittensor-core wheel构建矩阵在aarch64和x86_64环境下的首次运行失败问题。
判级:该PR仅修复CI构建配置(wheel matrix中的rustup和manylinux镜像问题),不涉及任何运行时逻辑、共识、资金或存储变更,对链上行为无影响。
#2869 ci: build the core sdist with uv instead of maturin-action MERGED ci
用uv替代maturin-action构建Python核心包的源码分发(sdist)
判级:纯CI配置更改,将sdist构建从maturin-action切换为uv,不涉及任何链上状态或运行时逻辑
#2874 ci: snapshot-cached runtime checks — split clone shards, required try-runtime snapshots, integrity manifests MERGED ci
优化运行时检查CI流程:拆分stake-sdk测试分片并引入快照缓存加速try-runtime
判级:纯 CI 流程优化(拆分测试分片、快照缓存),未修改任何链上逻辑、共识或资金相关代码,不影响运行时行为
#2875 docs: fix "fill or kill type or order" typo in allow_partial doc comments MERGED docs
修复allow_partial参数文档中的拼写错误,并作为新CI管道的首次完整测试
判级:纯文档注释修复(typo),无任何行为或状态变更;其余commits为CI/测试/工作流优化,不影响链上逻辑
#2881 ci: build the sdist before the docker wheel build MERGED ci
调整 Docker wheel 构建顺序,先构建 sdist 再构建 wheel 以解决权限问题
判级:纯 CI 构建流程调整,不涉及任何链上状态、共识或经济逻辑变更
#2882 ci: accelerate runtime, clone, and TypeScript E2E checks MERGED ci
优化运行时克隆、TypeScript E2E测试等CI流程,提升构建和测试速度
判级:仅涉及CI构建、缓存、测试加速等流水线优化,无任何链上逻辑、存储或共识变更
#2886 ci: idempotent PyPI publish re-runs; fix stale branch-strategy review docs MERGED ci
使PyPI发布可幂等重试并更新AI审阅分支策略文档
判级:纯CI流程优化(PyPI发布幂等)与文档修正(分支策略描述),无任何链上状态或核心逻辑改动
#2888 chore: rao-release — spec_version 430, devnet endpoint, SDK version from metadata, e2e de-flake BREAKING MERGED runtime
发布前准备:spec_version 429→430、Python SDK 新增 devnet 端点并改用包元数据读取版本号、e2e 测试防抖改进、文档更新
判级:运行时核心逻辑无任何实质性变更(spec_version 仅数字递增),其余均为测试/文档/构建基础设施改进,不触及资金、共识、emission 或迁移
关键改动
  • runtime/src/lib.rs:spec_version 从 429 升至 430,无其他运行时逻辑变更
  • sdk/python/bittensor/settings.py:新增 devnet 网络端点 wss://dev.chain.opentensor.ai:443
  • sdk/python/bittensor/__init__.py:__version__ 改为通过 importlib.metadata 从已安装包读取,取代硬编码的 "11.0.0.dev0"
  • sdk/bittensor-core/tests/e2e.rs:test_mev_shield_next_key_is_mlkem768 改为轮询 NextKey(最长达 30s)而非单次读取,消除偶发竞态失败
  • docs/concepts/network.mdx:文档新增 devnet 端点说明
#2889 ci: print CI key address and precheck balance in mainnet proposal MERGED ci
增强主网提案CI:打印CI密钥地址并预检查余额是否足以支付多签存款,避免因资金不足导致失败
判级:纯CI流程改进,打印地址和预检查余额,不修改链上逻辑或状态,不会影响运行时或资金安全