Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
143 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
fa3ff54
fix(chain-adapter): fix tsc errors and clean up unused code
Gaubee Jan 14, 2026
9b78231
fix(pages): add type adapter for history/detail.tsx
Gaubee Jan 14, 2026
6c6b6dd
fix(types): add pendingTxId and message to SubmitResult type
Gaubee Jan 14, 2026
8ee2af1
fix(tsc): fix unused variables and type narrowing issues
Gaubee Jan 14, 2026
9e9f3cf
fix(tests): add missing publicKey to ChainAddress mocks
Gaubee Jan 14, 2026
dfabf25
fix(tests): add publicKey to more ChainAddress mocks
Gaubee Jan 14, 2026
6209284
fix(tests): add publicKey and fix unused params in test files
Gaubee Jan 14, 2026
c43c164
fix(stories): add publicKey to chainAddresses in list.stories.tsx
Gaubee Jan 14, 2026
944033b
fix(stories): fix type issues in token-item.stories.tsx
Gaubee Jan 14, 2026
70b2026
fix(tsc): fix unused variables and create separate test tsconfig
Gaubee Jan 14, 2026
064d008
fix(tsc): batch fix unused variables in pages and components
Gaubee Jan 14, 2026
1d536fb
fix(types): add pendingTxId to BurnSubmitResult type
Gaubee Jan 14, 2026
4419139
config(tsc): add packages to exclude list
Gaubee Jan 14, 2026
8aefd3f
fix(hooks): add optional chaining for chainConfig.apis access
Gaubee Jan 14, 2026
0bccb42
fix(queries): remove exports for missing query modules
Gaubee Jan 14, 2026
ea876ed
fix(hooks): fix function call arguments in use-security-password
Gaubee Jan 14, 2026
4e286d5
remove: delete deprecated wallet-address-portfolio-from-provider comp…
Gaubee Jan 14, 2026
a029bc8
fix(pages): remove unused _isSupported variables
Gaubee Jan 14, 2026
2722f34
fix(tsc): batch fix wallet exports, imports, and type issues
Gaubee Jan 14, 2026
886f560
fix(pages): fix Select onValueChange type mismatches
Gaubee Jan 14, 2026
b3dfc57
fix(tsc): fix pending-tx-list translation and AddressDisplay mode
Gaubee Jan 14, 2026
157cd03
fix(tsc): batch fix type errors in multiple pages
Gaubee Jan 14, 2026
abcd393
fix(tsc): batch fix send, settings, query type errors
Gaubee Jan 14, 2026
a618edf
fix(tsc): add type assertions for SDK Destory methods
Gaubee Jan 14, 2026
ef586e0
fix(tsc): batch fix unused variables and imports
Gaubee Jan 14, 2026
317b993
fix(tsc): remove unused imports and fix constructor
Gaubee Jan 14, 2026
f39a7a9
fix(tsc): remove unused handler functions from send page
Gaubee Jan 14, 2026
8839cd0
fix(tsc): add publicKey, remove unused types and variables
Gaubee Jan 14, 2026
2720992
fix(tsc): clean up WalletTab unused imports and error vars
Gaubee Jan 14, 2026
5ce8441
fix(tsc): remove unused reset, fix i18n, comment EVM_CHAIN_IDS
Gaubee Jan 14, 2026
d922ef7
fix(tsc): fix MiniappDestroy txHash and notifications boolean
Gaubee Jan 14, 2026
edd2b74
fix(tsc): fix WalletPicker type issues with for-loop
Gaubee Jan 14, 2026
6de75e6
fix(tsc): add Token to TokenInfo type assertion in destroy page
Gaubee Jan 14, 2026
bea389f
fix(tsc): fix chain-config schema type issues
Gaubee Jan 14, 2026
a7cfb20
fix(tsc): fix all remaining type errors - ZERO TSC ERRORS! 🎉
Gaubee Jan 14, 2026
7148eb7
refactor(types): replace as unknown as TokenInfo with type-safe adapters
Gaubee Jan 14, 2026
a165761
refactor(types): replace as unknown as TransactionInfo with type-safe…
Gaubee Jan 14, 2026
4ab9e6c
refactor: unify transaction interface with TransactionIntent-based API
Gaubee Jan 15, 2026
19201d4
feat: add IBioAccountService interface and migrate use-security-password
Gaubee Jan 15, 2026
09f7b40
feat: complete send/burn hooks migration to ChainProvider
Gaubee Jan 15, 2026
dc38da1
feat: complete ChainProvider migration for remaining modules
Gaubee Jan 15, 2026
ec4ee75
fix: ChainProviderGate pattern for conditional hooks
Gaubee Jan 15, 2026
98c6312
fix: ChainProvider and key-fetch improvements
Gaubee Jan 15, 2026
41781cc
fix: interval polling, transaction order, and Select warning
Gaubee Jan 15, 2026
3fbe8f8
feat: add deps plugin for block-based refresh
Gaubee Jan 15, 2026
7084800
feat: deps plugin auto-subscribes to dependencies
Gaubee Jan 15, 2026
6cf174e
fix: prevent asset selection reset on token refresh
Gaubee Jan 15, 2026
38e0ace
fix: sync asset balance when tokens refresh
Gaubee Jan 15, 2026
aa8f836
fix: use updateAssetBalance for live balance sync
Gaubee Jan 15, 2026
8dd4e58
refactor: useSend uses getBalance for single source of truth
Gaubee Jan 15, 2026
e8cc3b2
fix: adjustAmountForFee handles different asset/fee currencies
Gaubee Jan 15, 2026
2423c0a
fix: pass pendingTxId in submit results for retry support
Gaubee Jan 15, 2026
b4cbe2d
fix: multiple send page issues
Gaubee Jan 15, 2026
e1a3b03
fix: sync pending tx when new block arrives
Gaubee Jan 15, 2026
5e60248
feat: pending tx key-fetch with blockHeight dependency
Gaubee Jan 15, 2026
d0ed50a
refactor: use key-fetch subscribe in TransferWalletLockJob
Gaubee Jan 15, 2026
71734ce
feat: add BioChain transaction fetcher with pendingTr support
Gaubee Jan 15, 2026
99e99b7
feat: add combine function to key-fetch
Gaubee Jan 15, 2026
5d37808
fix: combine uses context.params[key] for each source
Gaubee Jan 15, 2026
6d46fde
feat: implement transaction fetcher using combine
Gaubee Jan 15, 2026
bd7ff0e
feat: refactor derive and combine with proper plugin chain
Gaubee Jan 15, 2026
71c89a7
fix: extract asset info from pendingTr response
Gaubee Jan 15, 2026
bb25a6d
refactor: add unified convertBioTransactionToTransaction function
Gaubee Jan 15, 2026
69d9f21
fix: add paramsSchema to singleTxApi
Gaubee Jan 15, 2026
c5294c1
feat: add custom paramsSchema and transformParams to combine
Gaubee Jan 15, 2026
77d5c37
feat: use custom params in transaction combine
Gaubee Jan 15, 2026
a91020c
fix: use transformParams in onSubscribe
Gaubee Jan 15, 2026
8f94f52
fix: check transaction status when not in pending list
Gaubee Jan 15, 2026
279b3c6
refactor: simplify to direct transaction subscription
Gaubee Jan 15, 2026
87e24fd
fix: correct imports and types in TransferWalletLockJob
Gaubee Jan 15, 2026
9c97172
fix: use getChainProvider instead of useChainProvider hook
Gaubee Jan 15, 2026
e21f95d
docs: add transaction API adaptation plan
Gaubee Jan 15, 2026
c70159b
feat: add transaction support to EVM RPC Provider
Gaubee Jan 15, 2026
e005226
feat: add transaction support to Tron RPC Provider
Gaubee Jan 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
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