Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6972c8f
feat(key-fetch): add throttleError and apiKey plugins for Tron RPC
Gaubee Jan 22, 2026
df1dad0
feat(providers): add API key and 429 throttling to Etherscan and EVM RPC
Gaubee Jan 22, 2026
f4b1170
feat(providers): split Etherscan into V1/V2 with chainid support
Gaubee Jan 22, 2026
6e1e5f7
feat(providers): add ServiceLimitedError for user-friendly API error …
Gaubee Jan 22, 2026
6372703
feat(ui): add unified ServiceStatusAlert component for error handling
Gaubee Jan 22, 2026
cc03732
feat(key-fetch): route Schema validation errors through onError hook
Gaubee Jan 22, 2026
447cc90
feat(providers): add Moralis Provider for EVM token balances
Gaubee Jan 22, 2026
c9a98a7
fix(moralis-provider): use pathParams plugin for URL address substitu…
Gaubee Jan 22, 2026
d217cf5
feat(moralis-provider): filter spam tokens, add icon fallback, fix Re…
Gaubee Jan 22, 2026
01bdd95
fix(key-fetch): pass params to deps plugin subscriptions
Gaubee Jan 22, 2026
3b379c1
Revert "fix(key-fetch): pass params to deps plugin subscriptions"
Gaubee Jan 22, 2026
422107b
feat(key-fetch): refactor deps plugin with per-dependency params config
Gaubee Jan 22, 2026
6e1e17b
feat(chain-config): add tokenIconContract for EVM token icons
Gaubee Jan 22, 2026
386abe1
perf(providers): increase polling interval to 30s minimum for API cos…
Gaubee Jan 22, 2026
6d37083
feat(moralis-provider): optimize API costs and add transactionStatus
Gaubee Jan 22, 2026
5972453
fix(key-fetch): export globalRegistry for external usage
Gaubee Jan 22, 2026
6faa4f7
feat(key-fetch): enhance dedupe plugin with time window support
Gaubee Jan 22, 2026
9319724
feat(key-fetch): auto dedupe based on plugin introspection + fallback…
Gaubee Jan 22, 2026
d021e40
feat(chain-effect): deep refactor all providers with Effect native So…
Gaubee Jan 23, 2026
7a15644
feat(chain-effect): add superjson, NoSupportError, ServiceLimitedError
Gaubee Jan 23, 2026
bae7ee3
feat(chain-effect): migrate to useSyncExternalStore, remove CJS require
Gaubee Jan 23, 2026
b84ae5a
fix(chain-effect): add missing vite.config.ts for test runner
Gaubee Jan 23, 2026
34f2b4d
chore: remove @biochain/key-fetch package (replaced by chain-effect)
Gaubee Jan 23, 2026
492c4ed
fix(chain-effect): sync immediate fetch and check dependency current …
Gaubee Jan 23, 2026
3e05a6d
feat(chain-effect): add global source registry with ref counting and …
Gaubee Jan 23, 2026
50a4d0d
feat(chain-effect): add httpFetchCached for network request deduplica…
Gaubee Jan 23, 2026
52323fe
feat(chain-effect): add cache strategy + biowallet dependency chain r…
Gaubee Jan 23, 2026
ee271c7
fix(chain-effect): add error logging to prevent silent failures
Gaubee Jan 23, 2026
4927063
fix(chain-effect): trigger txHistory from pending confirmations
Gaubee Jan 23, 2026
9027374
fix(pending-tx): align polling interval with genesis block time
Gaubee Jan 23, 2026
3b6f287
feat: complete implementation
Gaubee Jan 23, 2026
654a478
feat: complete implementation
Gaubee Jan 23, 2026
4f148c4
feat: complete implementation
Gaubee Jan 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
# 申请地址: https://etherscan.io/myapikey
# ETHERSCAN_API_KEY="key1,key2,key3"

# Moralis API Key(用于 EVM 链 Token 余额和交易历史)
# 申请地址: https://admin.moralis.io/
# MORALIS_API_KEY="eyJhbGci..."

# ==================== E2E 测试 ====================

# 资金账号助记词 - 用于提供测试资金(24个中文词,空格分隔)
Expand Down
139 changes: 139 additions & 0 deletions CHAT.md
Original file line number Diff line number Diff line change
Expand Up @@ -1394,6 +1394,7 @@ review 的具体方向:
1. vitest进行单元测试 / storybook+vitest进行真实 DOM 测试 / e2e进行真实流程测试;
2. storybook-e2e / e2e 测试所生成截图是否覆盖了我们的变更;
3. 审查截图是否符合预期
4. 测试代码是否过于冗余?
5. 白皮书是否更新

---
Expand Down Expand Up @@ -1500,3 +1501,141 @@ All configured providers failed. Showing default value.
```

等数据加载下来,这个错误提示就不见了。说明程序错误地处理了“isLoading” 的逻辑,需要修复。然后找到同类的问题,继续统一修复。

---

CODE-JOB:
首先,统一一下:
interface ITransactionService 和 interface ApiProvider 存在重复,所以需要合并,把 src/services/chain-adapter/types.ts 这里面属于是真确的设计,全部规整一下,比如可以改成: interface ApiProvider extends Partial<ITransactionService>。不要 再让我看到出现重复的代码。

接着把接口做对了,就是 estimateFee/ buildTransaction ,它们的参数需要重新设计。但具体的实现上,可以先保持 只实现 TransferParams,其他的交易类型可以抛出不支持,不过 bioChain 的几种交易(转账、销毁、支付密码),都应该支持起来。其他链的可以只支持基本转账。

再然后,清理一下代码,确定 ChainProvider 已经统一了所有的标准,不再存在额外的标准或者专用标准。如果还发现存在额外标准,就继续做整合。

REVIEW-JOB:
签名面板是否已经统一使用 ChainProvider ?
资产、交易列表、pending交易列表、交易详情列表 等等页面,是否已经统一使用 ChainProvider ?
src/queries 这个文件夹里面的老代码还有谁在用?能不能升级成用 chain-provider?

---

fetchGenesisBlock 这个函数的实现有问题.
首先 chain-config 针对 biowallet-v1 已经提供了 config.genesisBlock,
而 chain-config 已经提供了 chain-adapter。
所以本质上应该有 chain-adapter 直接提供 genesisBlock-url

---

这些 query 依赖了 react-query。 统一升级成我们的 key-fetch。目的是可以做成 service,使得更容易测试。
链配置:use-chain-config-query.ts
汇率:use-exchange-rate-query.ts
价格:use-price-query.ts
质押:use-staking-query.ts

---

export interface IChainService 这个应该被重构,它本身的很多功能可以用 key-fetch 来实现

---

1. 预览页面,它不该用 BottomSheet 来进行展示,它应该是一个独立的 Activity,不能影响目前的交易签名面板
2. 预览交易是一个组件,不是页面,它是渲染在 send 页面中的,send 页面中的顶部会有一个步骤进度条,一共四步:填写表单、预览交易、广播中、结果展示
3. 广播中、结果展示:这里的组件,本质上和“交易详情”页面,是同一个组件
4. 预览交易:和“交易详情”页面类似,但是是一个简化版本,因为这时候还没有签名
5. 填写表单页面,点击发送,这时候

---

继续收尾工作

1. 默认使用 1 天的授权
2. 提交代码后,检查我们 KeyApp 的 CI,直到它能通过。
3. 对 [chain-services](/Users/kzf/Dev/GitHub/chain-services) 项目的代码做整理和提交,有一些没用的残留的文件可以删掉。

BUG:

- 我第一次登录,执行 login.signin 之前需要进行授权,授权了b9gB9NzHKWsDKGYFCaNva6xRnxPwFfGcfx的账号。
- 这时候 RWA-HUB 有了 Token
- 退出后,第二次登录,这次执行 login.signin 报错,发现它使用了 address: "bJ52cfZfhtVG6upHsDSpGi9L9QGqiimicM"
- 说明 cryptoBox 存在严重的安全问题。

---

i18n check 补充代码字符串中不可以有中文的检查
统一处理 KNOWN_PERMISSIONS 的 i18n

---

我们的 docs 网站上的 dweb 安装链接有问题,应该是`dweb://install?url=xxx.json`,现在却只想了 zip 文件。json 文件可以参考 https://iweb.xin/rwahub.bfmeta.com.dweb/metadata.json,确定符合标准。

你的目标是修复 dweb 的安装链接

---

目前 i18n 文件夹是被我们 exclude 的,因为如果开启,会遇到 tsc 的 bug。我怀疑是 json 太多导致动态生成类型存在一些问题。请你验证是不是 i18next.d.ts 引用了太多 json 导致的tsc-bug。
如果是,我个人的方案是:编写一个插件,能替代 i18next.d.ts:

1. gitignore i18next.d.ts
2. 执行 typecheck 之前,会使用这个插件更新生成 i18next.d.ts
3. 包装成 vite 插件,支持 vite-dev/build 都更新 i18next.d.ts,并且 dev 支持相关的 json 变更,就自动更新 i18next.d.ts

以上是我个人的想法,如果社区中有类似的或者更好的方案,请与我讨论。

---

深入调查并修复:我们明明已经配置 remoteMiniapps,为什么最终 cd 构建出来的 webapp 没有 rwa-hub?

---

接着我们需要改进 rwa-hub的样式适配。
方案一:我记得我们的 bio-sdk 是有提供 Context,其中包含了 safe-area 相关的配置,因为我们向页面注入了一个“胶囊”。所以我们需要在 [raw-hub](/Users/kzf/Dev/GitHub/chain-services/bfm-rwa-hub-app) 的源码中,注入css: `html{--f7-safe-area-top: ${safeAreaInsetTop}px }`。
方案二:让胶囊可以临时拖动,但是拖动的范围有限。并且拖动结束的 3s 后,会自动归位。自动归位的目的,是因为我们不能动态修改 胶囊对页面的影响,如果可以永久拖动,那么开发者适配胶囊的意义就没有了。拖动只是一个不得已的选择

目前来说 方案一 是可以立刻见效可以直接做的。你先执行方案一,然后我们再来讨论有什么更好的长期方案

---

深入调研我们的 Provider

[key-fetch] Error refetching tron-rpc.tron.txListApi: Error: [tron-rpc.tron.txListApi] HTTP 429:
响应内容: {"Error":"request rate exceeded the allowed_rps(3), and the query server is suspended for 4 s. To obtain higher request quotas and a more stable service, it is recommended to authenticate with an API
at KeyFetchInstanceImpl.doFetch (core.ts:119:13)

这种报错属于预期之中,不该在终端中疯狂显示,而是应该通过截流或者防抖来在终端打印警告。现在打印的是 error.
除了 tron,其它知名的 Provider 也应该有提供一定的错误处理的插件

---

基于 spec 文件,基于与 main 分支的差异,开始self-review。

相关 spec(基于时间从旧到新排序),每一个 spec 文件都是一次迭代后的计划产出:

- /Users/kzf/.factory/specs/2026-01-22-etherscan-v1-v2-provider-separation-plan.md
- /Users/kzf/.factory/specs/2026-01-22-ui-servicelimitederror.md
- /Users/kzf/.factory/specs/2026-01-22-blockheight-schema.md
- /Users/kzf/.factory/specs/2026-01-22-moralis-provider.md
- /Users/kzf/.factory/specs/2026-01-22-moralis-provider-1.md
- /Users/kzf/.factory/specs/2026-01-22-tokeniconcontract-ui.md
- /Users/kzf/.factory/specs/2026-01-22-moralis-provider-2.md
- /Users/kzf/.factory/specs/2026-01-22-enhanced-dedupe-plugin-with-time-window.md
- /Users/kzf/.factory/specs/2026-01-22-auto-dedupe-fallback-cooldown.md
- /Users/kzf/.factory/specs/2026-01-22-key-fetch-v2-core-refactoring-final.md
- /Users/kzf/.factory/specs/2026-01-22-key-fetch-v2.md
- /Users/kzf/.factory/specs/2026-01-23-key-fetch-rxjs-vs-effect-ts.md
- /Users/kzf/.factory/specs/2026-01-23-effect-ts-throttle-dedupe.md
- /Users/kzf/.factory/specs/2026-01-23-effect-subscriptionref-stream-changes.md
- /Users/kzf/.factory/specs/2026-01-23-eventbus-service.md

review 的具体方向:

1. 功能是否开发完全?
2. 代码架构是否合理?
1. 代码是否在正确的文件文件夹内?
2. 是否有和原项目重复代码?
3. 是否有遵守白皮书提供的最佳实践
4. 测试是否完善:
1. vitest进行单元测试 / storybook+vitest进行真实 DOM 测试 / e2e进行真实流程测试;
2. storybook-e2e / e2e 测试所生成截图是否覆盖了我们的变更;
3. 审查截图是否符合预期
4. 测试代码是否过于冗余?
5. 白皮书是否更新
42 changes: 41 additions & 1 deletion deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,14 @@
"@bfchain/util": "^5.0.0",
"@bfmeta/sign-util": "^1.3.10",
"@biochain/bio-sdk": "workspace:*",
"@biochain/key-fetch": "workspace:*",
"@biochain/chain-effect": "workspace:*",
"@biochain/key-ui": "workspace:*",
"@biochain/key-utils": "workspace:*",
"@biochain/plugin-navigation-sync": "workspace:*",
"@bnqkl/server-util": "^1.3.4",
"@bnqkl/wallet-sdk": "^0.23.8",
"@bnqkl/wallet-typings": "^0.23.8",
"@effect/platform": "^0.94.2",
"@fontsource-variable/dm-sans": "^5.2.8",
"@fontsource-variable/figtree": "^5.2.10",
"@fontsource/dm-mono": "^5.2.7",
Expand Down Expand Up @@ -113,6 +114,7 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"ed2curve": "^0.3.0",
"effect": "^3.19.15",
"i18next": "^25.7.1",
"idb": "^8.0.3",
"jsqr": "^1.4.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
{
"name": "@biochain/key-fetch",
"name": "@biochain/chain-effect",
"version": "0.1.0",
"description": "Plugin-based reactive fetch with subscription support",
"description": "Effect TS based reactive chain data fetching",
"type": "module",
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {
".": "./src/index.ts",
"./react": "./src/react.ts",
"./plugins": "./src/plugins/index.ts"
"./schema": "./src/schema.ts"
},
"scripts": {
"typecheck": "tsc --noEmit",
"typecheck:run": "tsc --noEmit",
"test": "vitest",
"test:run": "vitest run --passWithNoTests",
"lint:run": "oxlint .",
"i18n:run": "echo 'No i18n'",
"theme:run": "echo 'No theme'"
"lint:run": "oxlint ."
},
"peerDependencies": {
"react": "^19.0.0"
Expand All @@ -27,25 +25,24 @@
"optional": true
}
},
"dependencies": {
"effect": "^3.19.15",
"@effect/platform": "^0.94.2",
"superjson": "^2.2.6"
},
"devDependencies": {
"@testing-library/react": "^16.3.0",
"@types/react": "^19.0.0",
"jsdom": "^26.1.0",
"oxlint": "^1.32.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"typescript": "^5.9.3",
"vitest": "^4.0.0"
"vitest": "^4.0.0",
"vite-plugin-dts": "^4.5.4"
},
"keywords": [
"biochain",
"fetch",
"cache",
"effect",
"reactive",
"subscription"
"stream"
],
"license": "MIT",
"dependencies": {
"superjson": "^2.2.6"
}
}
"license": "MIT"
}
Loading