Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
4ac0c01
fix: wait for tokens to load before selecting asset from URL param
Gaubee Jan 12, 2026
e4067a0
fix: implement View in Explorer using chainConfig.explorer.queryTx
Gaubee Jan 12, 2026
2499588
refactor: integrate pending-tx into transaction service and fix broad…
Gaubee Jan 12, 2026
4e6bfec
feat: integrate pendingTxService into use-send and use-burn hooks
Gaubee Jan 12, 2026
edb470b
feat: add pending transaction UI in transaction history page
Gaubee Jan 12, 2026
fd4ff28
feat: add pending transaction detail page with retry/delete support
Gaubee Jan 12, 2026
d13ce04
feat: add PendingTxManager for automatic retry and status sync
Gaubee Jan 12, 2026
54975ea
feat: display pending transactions on wallet home page
Gaubee Jan 12, 2026
974bee4
feat: add missing txStatus i18n translations for created state
Gaubee Jan 12, 2026
db9fdcf
feat: integrate notification system with PendingTxManager
Gaubee Jan 12, 2026
e8f8eba
fix: use toSorted instead of sort to avoid mutation
Gaubee Jan 12, 2026
c94afa8
feat: add pending tx badge to TabBar and auto-cleanup expired transac…
Gaubee Jan 12, 2026
bea2e30
feat: add notification click navigation to pending tx detail page
Gaubee Jan 12, 2026
6223c72
feat: improve pending tx list UI with status colors and pulse animation
Gaubee Jan 12, 2026
834b4c9
fix: use consistent amber color for broadcasted status in detail page
Gaubee Jan 12, 2026
2f22f1f
test: add E2E tests for pending tx UI and service features
Gaubee Jan 12, 2026
77543b7
feat: auto-refresh balance after transaction confirmed
Gaubee Jan 12, 2026
ca27a83
feat: also refresh transaction history after confirmation
Gaubee Jan 12, 2026
e3c5d30
fix: simplify deleteExpired E2E test to avoid IndexedDB internal access
Gaubee Jan 12, 2026
82f32d2
feat: add pending tx i18n translations for ar and zh-TW
Gaubee Jan 12, 2026
acfcf35
test: add PendingTxList storybook stories and e2e screenshots
Gaubee Jan 12, 2026
c615987
fix: broadcast result parsing and pattern lock error handling
Gaubee Jan 13, 2026
da298bc
fix: treat duplicate transaction error (001-00034) as success
Gaubee Jan 13, 2026
bd4ffdc
style: use pre tag with overflow for error message display
Gaubee Jan 13, 2026
ebda29e
fix: handle duplicate transaction (001-00034) by marking as confirmed
Gaubee Jan 13, 2026
7ea8dfa
test: add BroadcastResult and alreadyExists tests
Gaubee Jan 13, 2026
5b181f5
fix: add retry button to pending tx list in transaction history page
Gaubee Jan 13, 2026
24e5f86
fix: handle 001-00034 duplicate tx in ApiError catch block
Gaubee Jan 13, 2026
075b722
test: add comprehensive TDD tests for 001-00034 duplicate tx handling
Gaubee Jan 13, 2026
1003d75
fix: resolve lint errors in pending-tx-list component
Gaubee Jan 13, 2026
dbb0351
feat: add ExpirationChecker for BioChain + TransferWalletLockJob flow…
Gaubee Jan 13, 2026
a2e9f21
feat: P1 improvements - pendingTxId return, elapsed time display, isE…
Gaubee Jan 13, 2026
f0e834c
feat: add isRetryable property to BroadcastError for network error ha…
Gaubee Jan 13, 2026
df2515c
test: add unit tests for pending-tx expiration and BroadcastError.isR…
Gaubee Jan 13, 2026
ce28f9c
feat: unify Send/Destroy pages to pass pendingTxId to TransferWalletL…
Gaubee Jan 13, 2026
10feb08
feat: limit pending-tx list to 3 items on home page with view all button
Gaubee Jan 13, 2026
67b267b
feat: add clear all failed transactions button
Gaubee Jan 13, 2026
7d90d87
feat: add confirmed block height and time display for pending tx
Gaubee Jan 13, 2026
8258a8a
feat: add more broadcast error code i18n translations
Gaubee Jan 13, 2026
63ba464
feat: add Storybook stories for pending-tx detail page
Gaubee Jan 13, 2026
fbdb488
fix: use i18n for pending-tx notification messages and add white-book…
Gaubee Jan 13, 2026
2472931
feat: add Storybook stories for TransferWalletLockJob and PendingTxDe…
Gaubee Jan 13, 2026
cd269fe
test: enhance pendingTxManager unit tests with subscription, status t…
Gaubee Jan 13, 2026
6e933d9
fix: use i18n for broadcast timeout error message
Gaubee Jan 13, 2026
facad58
fix: use i18n for remaining hardcoded broadcast failed message
Gaubee Jan 13, 2026
65c3a22
fix: pending tx list updates immediately and BottomSheet shows broadc…
Gaubee Jan 13, 2026
63bc2e2
feat: add @biochain/key-fetch plugin-based reactive fetch with subscr…
Gaubee Jan 13, 2026
95c18c6
fix: complete keyFetch interval plugin with dynamic forgeInterval fro…
Gaubee Jan 13, 2026
88f155e
refactor: migrate bioforest services to use keyFetch for reactive dat…
Gaubee Jan 13, 2026
2f044f1
refactor: migrate getTransactionHistory to use keyFetch
Gaubee Jan 13, 2026
17e8fd8
refactor: migrate balance and transaction queries to keyFetch
Gaubee Jan 13, 2026
ee86c7c
refactor: migrate address queries to keyFetch, remove React Query dep…
Gaubee Jan 13, 2026
6439678
refactor: redesign keyFetch with Schema-first factory pattern
Gaubee Jan 13, 2026
29306c2
refactor: migrate bioforest services to new keyFetch architecture
Gaubee Jan 13, 2026
056ff35
fix: remove deleted key-fetch-rules import from service-main
Gaubee Jan 13, 2026
69b4aa2
docs: add correct typecheck commands to CLAUDE.md
Gaubee Jan 13, 2026
3e7e21e
fix: remove unused imports in key-fetch package
Gaubee Jan 13, 2026
5ce7b9d
fix: remove unused chainConfigSelectors import
Gaubee Jan 13, 2026
ed1217a
docs: clarify typecheck commands and turbo cache in CLAUDE.md
Gaubee Jan 13, 2026
da75674
fix: remove unused PendingTxStatus import
Gaubee Jan 13, 2026
6609b36
fix: add optional chaining for chainConfig.apis and import BFChainCor…
Gaubee Jan 13, 2026
ace36ca
fix: remove unused vitest imports in pending-tx-manager test
Gaubee Jan 13, 2026
a2e67ab
fix: add @biochain/key-fetch to dependencies and exclude agent-flow f…
Gaubee Jan 13, 2026
50b5ee0
fix: use getBiowalletApi instead of getApiUrl
Gaubee Jan 13, 2026
8fc5b3f
fix: remove unused import and use getBiowalletApi
Gaubee Jan 13, 2026
74c22f8
fix: conservative TypeScript error fixes - unused vars and imports
Gaubee Jan 13, 2026
be48cb3
fix: TypeScript errors in bio-sdk providers and key-fetch core
Gaubee Jan 13, 2026
c18fb65
fix: runtime errors in pending-tx feature
Gaubee Jan 13, 2026
2c1c301
refactor(chain-adapter): migrate to Mixin Factory pattern
Gaubee Jan 14, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ node_modules
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/assets
eslint.config.js

# misc
/.sass-cache
Expand Down
360 changes: 241 additions & 119 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
"plugins": ["react", "typescript", "jsx-a11y", "unicorn"],
"jsPlugins": [
"eslint-plugin-i18next",
"eslint-plugin-file-component-constraints"
],
"jsPlugins": ["eslint-plugin-i18next", "eslint-plugin-file-component-constraints", "eslint-plugin-unused-imports"],
"categories": {
"correctness": "warn",
"suspicious": "warn",
Expand All @@ -16,6 +13,8 @@
},
"rules": {
"no-unused-vars": "warn",
"no-restricted-imports": "warn",
"eslint-plugin-unused-imports/no-unused-imports": "error",
"no-console": "warn",
"eqeqeq": "error",
"no-var": "error",
Expand All @@ -33,6 +32,7 @@
"typescript/no-explicit-any": "error",
"typescript/prefer-ts-expect-error": "warn",
"typescript/no-non-null-assertion": "warn",
"typescript/consistent-type-imports": "error",

"jsx-a11y/alt-text": "warn",
"jsx-a11y/anchor-is-valid": "warn",
Expand All @@ -41,123 +41,245 @@
"unicorn/prefer-query-selector": "off",
"unicorn/require-module-specifiers": "off",

"file-component-constraints/enforce": ["error", {
"rules": [{
"fileMatch": "**/sheets/Miniapp*.tsx",
"mustUse": ["MiniappSheetHeader"],
"mustImportFrom": {
"MiniappSheetHeader": ["@/components/ecosystem"]
}
}]
}],

"i18next/no-literal-string": ["warn", {
"mode": "jsx-only",
"jsx-components": {
"exclude": ["Trans", "Icon", "TablerIcon"]
},
"jsx-attributes": {
"exclude": [
"className", "styleName", "style", "type", "key", "id", "name", "role", "as", "asChild",
"data-testid", "data-test", "data-slot", "data-state", "data-side", "data-align",
"to", "href", "src", "alt", "target", "rel", "method", "action",
"variant", "size", "color", "weight", "sign", "align", "justify", "direction", "orientation",
"inputMode", "autoComplete", "autoFocus", "autoCapitalize", "spellCheck",
"enterKeyHint", "pattern", "min", "max", "step", "accept",
"xmlns", "viewBox", "fill", "stroke", "d", "cx", "cy", "r", "x", "y", "width", "height",
"strokeWidth", "strokeLinecap", "strokeLinejoin", "transform", "clipPath", "mask",
"side", "position", "chain", "status", "mode", "format", "locale", "currency",
"defaultValue", "value", "checked", "selected", "disabled", "required", "readOnly",
"tabIndex", "htmlFor", "form", "formAction", "formMethod", "formTarget"
]
},
"callees": {
"exclude": [
"t", "i18n.t", "useTranslation", "Trans", "tCommon", "tAuthorize",
"console.*", "require", "import", "Error", "TypeError", "new Error", "new TypeError",
"push", "pop", "replace", "navigate", "redirect",
"querySelector", "querySelectorAll", "getElementById", "getElementsByClassName",
"addEventListener", "removeEventListener", "dispatchEvent",
"setTimeout", "setInterval", "clearTimeout", "clearInterval",
"JSON.parse", "JSON.stringify", "Object.keys", "Object.values", "Object.entries",
"Array.from", "Array.isArray", "String.fromCharCode",
"Math.*", "Number.*", "Date.*", "RegExp",
"fetch", "axios.*", "localStorage.*", "sessionStorage.*",
"describe", "it", "test", "expect", "vi.*", "jest.*",
"showError", "handleBlur", "join"
]
},
"words": {
"exclude": [
"[A-Z_-]+",
"[0-9.]+",
"^\\s*$",
"^[a-z]+$",
"^[a-zA-Z]+\\.[a-zA-Z]+",
"^https?://",
"^mailto:",
"^tel:",
"^#[a-fA-F0-9]+$",
"^rgb",
"^hsl",
"^en-US$",
"^zh-CN$",
"^zh-TW$",
"^ar$",
"^default$",
"^ethereum$",
"^bitcoin$",
"^tron$",
"^bfmeta$",
"Alice",
"Bob",
"Carol",
"Dave",
"^✓$",
"^→",
"→",
"^←",
"^↓",
"^↑",
"^≈",
"≈ \\$",
"^\\?$",
"^-$",
"^\\*$",
"^•$",
"^%$",
"^—$",
"^·$",
"^/\\d+$",
"^\\d{1,2}:\\d{2}$",
"^\\$",
"•+",
"BFM Pay",
"Ethereum",
"Bitcoin",
"BNB Chain",
"Tron",
"BFMeta",
"BFChain",
"CCChain",
"PMChain",
"BSC",
"ETH",
"USDT",
"BFM",
"BFC",
"Close",
"^99\\+$",
"Copied",
"Copy to clipboard",
"password-error",
"^:$",
"^:$",
"^daysAgo$",
"^yesterday$"
"file-component-constraints/enforce": [
"error",
{
"rules": [
{
"fileMatch": "**/sheets/Miniapp*.tsx",
"mustUse": ["MiniappSheetHeader"],
"mustImportFrom": {
"MiniappSheetHeader": ["@/components/ecosystem"]
}
}
]
}
}]
],

"i18next/no-literal-string": [
"warn",
{
"mode": "jsx-only",
"jsx-components": {
"exclude": ["Trans", "Icon", "TablerIcon"]
},
"jsx-attributes": {
"exclude": [
"className",
"styleName",
"style",
"type",
"key",
"id",
"name",
"role",
"as",
"asChild",
"data-testid",
"data-test",
"data-slot",
"data-state",
"data-side",
"data-align",
"to",
"href",
"src",
"alt",
"target",
"rel",
"method",
"action",
"variant",
"size",
"color",
"weight",
"sign",
"align",
"justify",
"direction",
"orientation",
"inputMode",
"autoComplete",
"autoFocus",
"autoCapitalize",
"spellCheck",
"enterKeyHint",
"pattern",
"min",
"max",
"step",
"accept",
"xmlns",
"viewBox",
"fill",
"stroke",
"d",
"cx",
"cy",
"r",
"x",
"y",
"width",
"height",
"strokeWidth",
"strokeLinecap",
"strokeLinejoin",
"transform",
"clipPath",
"mask",
"side",
"position",
"chain",
"status",
"mode",
"format",
"locale",
"currency",
"defaultValue",
"value",
"checked",
"selected",
"disabled",
"required",
"readOnly",
"tabIndex",
"htmlFor",
"form",
"formAction",
"formMethod",
"formTarget"
]
},
"callees": {
"exclude": [
"t",
"i18n.t",
"useTranslation",
"Trans",
"tCommon",
"tAuthorize",
"console.*",
"require",
"import",
"Error",
"TypeError",
"new Error",
"new TypeError",
"push",
"pop",
"replace",
"navigate",
"redirect",
"querySelector",
"querySelectorAll",
"getElementById",
"getElementsByClassName",
"addEventListener",
"removeEventListener",
"dispatchEvent",
"setTimeout",
"setInterval",
"clearTimeout",
"clearInterval",
"JSON.parse",
"JSON.stringify",
"Object.keys",
"Object.values",
"Object.entries",
"Array.from",
"Array.isArray",
"String.fromCharCode",
"Math.*",
"Number.*",
"Date.*",
"RegExp",
"fetch",
"axios.*",
"localStorage.*",
"sessionStorage.*",
"describe",
"it",
"test",
"expect",
"vi.*",
"jest.*",
"showError",
"handleBlur",
"join"
]
},
"words": {
"exclude": [
"[A-Z_-]+",
"[0-9.]+",
"^\\s*$",
"^[a-z]+$",
"^[a-zA-Z]+\\.[a-zA-Z]+",
"^https?://",
"^mailto:",
"^tel:",
"^#[a-fA-F0-9]+$",
"^rgb",
"^hsl",
"^en-US$",
"^zh-CN$",
"^zh-TW$",
"^ar$",
"^default$",
"^ethereum$",
"^bitcoin$",
"^tron$",
"^bfmeta$",
"Alice",
"Bob",
"Carol",
"Dave",
"^✓$",
"^→",
"→",
"^←",
"^↓",
"^↑",
"^≈",
"≈ \\$",
"^\\?$",
"^-$",
"^\\*$",
"^•$",
"^%$",
"^—$",
"^·$",
"^/\\d+$",
"^\\d{1,2}:\\d{2}$",
"^\\$",
"•+",
"BFM Pay",
"Ethereum",
"Bitcoin",
"BNB Chain",
"Tron",
"BFMeta",
"BFChain",
"CCChain",
"PMChain",
"BSC",
"ETH",
"USDT",
"BFM",
"BFC",
"Close",
"^99\\+$",
"Copied",
"Copy to clipboard",
"password-error",
"^:$",
"^:$",
"^daysAgo$",
"^yesterday$"
]
}
}
]
},
"env": {
"browser": true,
Expand Down
Loading
Loading