Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
368 commits
Select commit Hold shift + click to select a range
aca7811
feat(staking): add search loading spinner and improve pool list perfo…
jorbuedo Nov 19, 2025
06cc8e1
redeem
jorbuedo Nov 20, 2025
74352c1
feat: update Midnight redemption API to preprod endpoint and fix erro…
jorbuedo Nov 20, 2025
48623c7
feat: add midnightAirdrop feature flag
jorbuedo Nov 20, 2025
120e83e
Merge branch 'develop' into midnight-lost-and-found
jorbuedo Nov 20, 2025
bbdfb84
fix: resolve lint, TypeScript, and type errors
jorbuedo Nov 20, 2025
fd90c59
Merge branch 'develop' into midnight-redeem
jorbuedo Nov 20, 2025
6ef5f12
Merge develop into mobile-experimental
jorbuedo Nov 20, 2025
ea05efe
Fix lint and type errors after merge
jorbuedo Nov 20, 2025
3cd7751
Fix merge-related TypeScript errors and test failures
jorbuedo Nov 20, 2025
b8b925d
feat(airdrop): add midnightAirdrop feature flag check to redeem banner
jorbuedo Nov 20, 2025
c8c07d5
feat(airdrop): gate eligibility API calls behind midnightAirdrop feat…
jorbuedo Nov 20, 2025
0582cba
feat(experimental): Integrate governance features into v7 (#4360)
jorbuedo Nov 20, 2025
bef0f7b
fix gov
jorbuedo Nov 20, 2025
87b019c
fix: resolve all require cycles
jorbuedo Nov 20, 2025
81f2756
Merge branch 'develop' into mobile-experimental
jorbuedo Nov 20, 2025
0de18f2
perf: optimize React rendering performance based on profiler analysis
jorbuedo Nov 20, 2025
42691a8
refactor: consolidate debounce utilities into @yoroi/common package
jorbuedo Nov 20, 2025
5ed9250
perf: optimize PIN input and mnemonic input performance
jorbuedo Nov 20, 2025
8b7eaeb
perf: optimize navigation stack and component rendering
jorbuedo Nov 20, 2025
a8cb058
docs: add comprehensive API endpoint investigation report
jorbuedo Nov 21, 2025
681f0ec
Merge branch 'develop' into midnight-redeem
jorbuedo Nov 21, 2025
543cde3
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Nov 21, 2025
fa5338a
Merge remote-tracking branch 'origin/develop' into midnight-redeem
jorbuedo Nov 21, 2025
8c23ac9
feat: add comprehensive test coverage and fix lint/type errors
jorbuedo Nov 22, 2025
a642a7e
test(tx): add comprehensive test coverage for tx package
jorbuedo Nov 22, 2025
457f473
test(tx): add high-priority tests for ledger and transaction builder
jorbuedo Nov 22, 2025
f0ca420
docs: add comprehensive test coverage plan for all packages
jorbuedo Nov 22, 2025
851a915
missed
jorbuedo Nov 22, 2025
302d9fb
docs: update test coverage plan with actual coverage metrics
jorbuedo Nov 22, 2025
2ec3187
test: improve coverage for nearly complete packages
jorbuedo Nov 22, 2025
9b68cb9
test: add more coverage for remaining gaps in nearly complete packages
jorbuedo Nov 22, 2025
31e2de9
test: add more coverage for remaining gaps
jorbuedo Nov 22, 2025
97c1a37
test: fix lint errors and complete remaining coverage gaps
jorbuedo Nov 22, 2025
3ef464f
test: add more coverage for remaining gaps
jorbuedo Nov 22, 2025
1f9939b
test: add coverage for remaining branch gaps in nearly complete packages
jorbuedo Nov 22, 2025
5298500
test: add coverage for swap package muesliswap adapters
jorbuedo Nov 22, 2025
0629460
test: fix lint errors in swap package tests
jorbuedo Nov 22, 2025
7913d72
test: add coverage for links package cardano validators and params
jorbuedo Nov 22, 2025
826c85d
test(links): add comprehensive tests for cardano link module
jorbuedo Nov 22, 2025
5a07ba8
test(theme): improve test coverage to 100%
jorbuedo Nov 22, 2025
b1ffca4
test(dapp-connector): add comprehensive tests for resolver and async-…
jorbuedo Nov 22, 2025
3d81676
test(resolver): add tests for constants and query-client fixture
jorbuedo Nov 22, 2025
3c5e992
test(staking): add tests for pool-info-api-helpers
jorbuedo Nov 22, 2025
5b0a899
test(staking): add comprehensive tests for pools API
jorbuedo Nov 22, 2025
c77773c
test(staking): add tests for pool-info-api utility functions
jorbuedo Nov 22, 2025
fe09cb8
test(staking): add tests for config files and context providers
jorbuedo Nov 22, 2025
9bc7643
test(staking): fix governance context test error handling
jorbuedo Nov 22, 2025
8160682
test: improve coverage for nearly complete packages
jorbuedo Nov 22, 2025
6f9692a
refactor: consolidate duplicate utility functions and fix dangerous c…
jorbuedo Nov 22, 2025
a1ab740
refactor: use parseNumberFromText for amount input parsing
jorbuedo Nov 22, 2025
4805fe5
Unify error and success screens with ResultScreen component
jorbuedo Nov 22, 2025
48eac49
feat(staking): prioritize preferred non-saturated pools in staking ce…
jorbuedo Nov 22, 2025
6fa4a0e
refactor(api): move types and utilities to packages, fix imports and …
jorbuedo Nov 22, 2025
9d287b8
set legacy as main backend
jorbuedo Nov 22, 2025
4c32efb
fix: update API preferences to match develop branch and fix lint/types
jorbuedo Nov 22, 2025
38d1092
docs: add comprehensive multi-chain integration plan for Bitcoin and …
jorbuedo Nov 22, 2025
d66648f
chore: update bun.lock to sync with package.json
jorbuedo Nov 22, 2025
116d44d
feat: add separate bundle IDs for development builds
jorbuedo Nov 22, 2025
63866c1
fix(dapp): update logo base URL to use GitHub instead of CloudFront
AbdullayevAbdurashid Nov 24, 2025
3d053e9
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Nov 24, 2025
02eeef4
Merge branch 'develop' into YV-777-adapt-dapp-logo-to-use-github-inst…
jorbuedo Nov 24, 2025
ebcadf7
initial screen and analytics enhancements
jorbuedo Nov 25, 2025
347a6cb
fix first time no storage error
jorbuedo Nov 25, 2025
5ffaaa2
fix: resolve infinite loop in PIN setup and React Query cache persist…
jorbuedo Nov 25, 2025
c539fe0
fix: resolve mnemonic input suggestions flashing and focus issues
jorbuedo Nov 25, 2025
ef0b3a7
fix: close GetImportantAlertsModal after OS permission dialog closes
jorbuedo Nov 25, 2025
7cc4026
Merge remote-tracking branch 'origin/YV-777-adapt-dapp-logo-to-use-gi…
jorbuedo Nov 25, 2025
c61df6b
refactor: use useDappList hook in SelectDappFromListScreen and fix Vi…
jorbuedo Nov 25, 2025
f9c22e5
add links test script
jorbuedo Nov 25, 2025
b9066b2
feature(mobile): governance revamp
banklesss Nov 25, 2025
f31df62
fix: deep link wallet restoration and UI improvements
jorbuedo Nov 25, 2025
e79dcb2
Merge branch 'develop' into midnight-redeem
jorbuedo Nov 25, 2025
bfd7a2c
feat: unify link action handling and enforce login for wallet restora…
jorbuedo Nov 25, 2025
3b79727
feat: add pending action banner UI and fix modal state update warnings
jorbuedo Nov 25, 2025
3464a49
feat: improve wallet selection modal and fix action processing
jorbuedo Nov 25, 2025
884f9c0
fix
jorbuedo Nov 25, 2025
386daba
feat: implement Cardano DRep delegation deep link
jorbuedo Nov 26, 2025
765a1ef
feat: convert exchange result to modal, remove wallet requirement
jorbuedo Nov 26, 2025
562d00a
feat: refactor claim flow to use dedicated screen instead of modal
jorbuedo Nov 26, 2025
f26ce28
chore: format code with prettier
jorbuedo Nov 26, 2025
92a74f8
refactor(mobile): governance revamp
banklesss Nov 26, 2025
a4fe159
feature(mobile): governance drep modal revamp
banklesss Nov 26, 2025
f5193fb
feat: improve address and transaction modals
jorbuedo Nov 26, 2025
f9826ae
feat: implement P2P CIP-30 integration with global connection status
jorbuedo Nov 26, 2025
8a022ad
feat: add standalone dev build without Expo dev client
jorbuedo Nov 26, 2025
7f68cc7
Merge develop into mobile-experimental
jorbuedo Nov 26, 2025
aeca938
Merge develop into feature/governance-new-drep-modal
jorbuedo Nov 26, 2025
fa21467
fix: resolve lint warnings and formatting issues
jorbuedo Nov 26, 2025
a6e8e94
Yv 755 governance implement popup when delegating stake (#4372)
AbdullayevAbdurashid Nov 26, 2025
c79c206
refactor: move P2PConnectionStatusBar to WalletTabNavigator
jorbuedo Nov 26, 2025
1ef7201
fix
jorbuedo Nov 26, 2025
de3da93
Merge branch 'develop' into mobile-experimental
jorbuedo Nov 26, 2025
999bf3b
Merge branch 'feature/governance-new-drep-modal' into mobile-experime…
jorbuedo Nov 26, 2025
dba0177
fix
jorbuedo Nov 26, 2025
5e900a5
fix: improve UTXO selection to account for minimum UTXO and deposits
jorbuedo Nov 26, 2025
0771ec0
Merge midnight-redeem into mobile-experimental
jorbuedo Nov 26, 2025
9ba07df
feat: create common Address component with modal functionality
jorbuedo Nov 26, 2025
87e05e0
refactor: migrate from deprecated TransactionInfo to WalletTransaction
jorbuedo Nov 26, 2025
be799bb
reduce logger
jorbuedo Nov 26, 2025
d77e63b
fix
jorbuedo Nov 26, 2025
f736e6b
feat: improve restore wallet flow with QR code scanning and keyboard …
jorbuedo Nov 26, 2025
3366bd4
fix
jorbuedo Nov 26, 2025
9a4e4ca
fix
jorbuedo Nov 26, 2025
c30fe98
trying to fix mnemonic suggestions
jorbuedo Nov 26, 2025
a81ef6c
update bun lock
jorbuedo Nov 26, 2025
51c79d6
fix: restore wallet from QR code navigation and password manager prompts
jorbuedo Nov 26, 2025
5415c38
fix: resolve transaction success screen showing error screen
jorbuedo Nov 27, 2025
f4746b5
fix: resolve transaction success screen showing error screen
jorbuedo Nov 27, 2025
62a75ce
Merge branch 'mobile-experimental' of github.com:Emurgo/yoroi into mo…
jorbuedo Nov 27, 2025
11c225e
fix lock
jorbuedo Nov 27, 2025
bdd7310
feature(mobile): governance drep modal revamp (#4381)
banklesss Nov 27, 2025
6113d57
fix: improve transaction error handling and fix collateral tx hash ca…
jorbuedo Nov 27, 2025
30cbb5e
refactor: create utility function for safe txId extraction in onSucce…
jorbuedo Nov 27, 2025
90739b9
fix: auto-detect and protect collateral UTXO on wallet restore
jorbuedo Nov 27, 2025
cf9274e
pool list changes
jorbuedo Nov 27, 2025
3915956
feat: add preprod DRep ID support for governance
jorbuedo Nov 27, 2025
6d10b28
Merge branch 'develop' into mobile-experimental
jorbuedo Nov 27, 2025
b56788f
try to fix ci
jorbuedo Nov 27, 2025
d0fe73a
fix: resolve all TypeScript type errors
jorbuedo Nov 27, 2025
990517a
feat: add QR illustration to scan QR code card in restore wallet
jorbuedo Nov 27, 2025
ea6b6d7
docs: add extension greenfield migration plan
jorbuedo Nov 27, 2025
09d5463
fix
jorbuedo Nov 27, 2025
c1e8f9f
refactor: consolidate transaction types and remove deprecated code
jorbuedo Nov 28, 2025
5eb9852
refactor: migrate token utilities to packages/api and fix type errors
jorbuedo Nov 28, 2025
7fc9393
refactor: move useRemoteConfig from features to hooks directory
jorbuedo Nov 28, 2025
4571a71
fix: hide Share section for partial readonly wallets
jorbuedo Nov 28, 2025
ef5e89c
refactor: update P2P connection links to use new parameter format
jorbuedo Nov 28, 2025
f5a1706
feat: implement PeerJS protocol compatibility and remove legacy P2P f…
jorbuedo Nov 28, 2025
c1e6d1d
Yv 756 withdraw rewards governance popup (#4383)
AbdullayevAbdurashid Nov 28, 2025
afd58e8
feat: add mint/burn feature and fix transaction review navigation
jorbuedo Nov 28, 2025
6d51bdd
fix: correct asset amount calculation for transactions with empty ass…
jorbuedo Nov 29, 2025
e6bfd39
fix
jorbuedo Nov 29, 2025
f59d33e
fix: handle empty asset names in transaction formatting
jorbuedo Nov 29, 2025
ffc6081
fix: resolve require cycles, replace console with logger, and fix lin…
jorbuedo Nov 29, 2025
886e102
fix: break circular dependency cycle between api, tx, and blockchains…
jorbuedo Nov 29, 2025
52c91fe
Branded types (#4384)
jorbuedo Nov 29, 2025
fcc7296
refactor: deprecate Amount type and unify to BalanceQuantity
jorbuedo Nov 29, 2025
aeabef1
fix: reload all wallets on network change and improve logging
jorbuedo Nov 29, 2025
285acb1
fix: fix runner.test.ts migration test failures
jorbuedo Nov 29, 2025
0d91ede
No class or any (#4385)
jorbuedo Nov 30, 2025
2853038
fix: prioritize cancel APIs and fix disclaimer storage
jorbuedo Nov 30, 2025
323bcf8
fix: resolve TypeScript errors and test failures
jorbuedo Nov 30, 2025
65816cd
fix: resolve disclaimer storage double-parsing bug
jorbuedo Nov 30, 2025
5aa55fd
cleanup
jorbuedo Nov 30, 2025
e50430e
feat: add encryption support to wallet deeplink sharing
jorbuedo Nov 30, 2025
20544a4
fix
jorbuedo Nov 30, 2025
56e7e38
fix: update Ledger packages and fix hardware wallet Bluetooth connection
jorbuedo Dec 1, 2025
8bcb2ee
fix: use cip_129 bech32 format for DRep ID validation when resolving …
jorbuedo Dec 1, 2025
b3a5c0c
Ledger fixes (#4387)
jorbuedo Dec 1, 2025
676bcc2
chore: deactivate EarnRewardsBanner in transaction history
jorbuedo Dec 1, 2025
dfc9e9e
fix: prevent transaction skipping by using per-chunk cursors
jorbuedo Dec 1, 2025
4b7452d
fix
jorbuedo Dec 1, 2025
2a26911
feat: add transaction filter modal with operation types, metadata/mem…
jorbuedo Dec 1, 2025
ee7e7ad
feat: add loading indicators for wallet selection flow
jorbuedo Dec 1, 2025
de5dda4
fix
jorbuedo Dec 1, 2025
b111b45
Merge branch 'develop' into mobile-experimental
jorbuedo Dec 1, 2025
576d9eb
fix: prevent duplicate loading spinners in transaction history
jorbuedo Dec 1, 2025
bcac619
fix consolidation utxo edge cases
jorbuedo Dec 2, 2025
b861ed5
fix: position mnemonic suggestions above keyboard correctly
jorbuedo Dec 2, 2025
ffb734e
fix: improve transaction filter modal keyboard avoidance and UI
jorbuedo Dec 2, 2025
5cb1611
feat: add icon gallery screen to dev menu
jorbuedo Dec 2, 2025
85ee087
tidy up governance review tx
jorbuedo Dec 2, 2025
6a4062a
fixes
jorbuedo Dec 2, 2025
8091f3f
fix: show pool ID instead of null in preprod and improve layout
jorbuedo Dec 2, 2025
3f15ba2
fix: skip preferred pool sorting when searching by name
jorbuedo Dec 2, 2025
60884d0
fix: improve governance modal behavior for delegation and undelegation
jorbuedo Dec 2, 2025
0406b68
fix: improve governance modal behavior for delegation and undelegation
jorbuedo Dec 2, 2025
c94080d
Merge branch 'mobile-experimental' of github.com:Emurgo/yoroi into mo…
jorbuedo Dec 2, 2025
8152614
cleanup
jorbuedo Dec 2, 2025
ac2ba62
fix
jorbuedo Dec 2, 2025
30f220e
feat: add optimistic transaction submission
jorbuedo Dec 2, 2025
f3d0b12
fix: improve tx history layout and wallet selection loading state
jorbuedo Dec 2, 2025
e8ead0b
make dev build standalone
jorbuedo Dec 2, 2025
c9998b9
remove sim
jorbuedo Dec 3, 2025
d9b74f7
chore: remove screen sharing toggle and prevention functionality
jorbuedo Dec 3, 2025
823c153
fix
jorbuedo Dec 3, 2025
eacda7c
Merge develop into mobile-experimental
jorbuedo Dec 3, 2025
c9032c1
remove mnemonic sugestion once phrase is verified
jorbuedo Dec 3, 2025
1dffa29
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Dec 3, 2025
5f928cb
fix
jorbuedo Dec 3, 2025
ea7221c
fix
jorbuedo Dec 3, 2025
a8d4579
reorg menu
jorbuedo Dec 3, 2025
cf2ea5d
refactor: create normalizeTokenId utility in portfolio package
jorbuedo Dec 3, 2025
87cc883
fix tests
jorbuedo Dec 3, 2025
83df7a2
Core refactor (#4394)
jorbuedo Dec 3, 2025
030e26f
Merge branch 'develop' into mobile-experimental
jorbuedo Dec 3, 2025
a0a7a15
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Dec 4, 2025
09ec0c1
Yw 115 midnight UI mprovements (#4397)
AbdullayevAbdurashid Dec 4, 2025
de09832
fix conflicts
jorbuedo Dec 4, 2025
8dbde3b
refactor: rename airdrop screens and fix Menu header
jorbuedo Dec 4, 2025
ab9ca9b
feat: add redeem badge and notification dot for airdrop thaws
jorbuedo Dec 4, 2025
8f7629b
fix
jorbuedo Dec 4, 2025
9727585
fix
jorbuedo Dec 4, 2025
604a31b
improve hard refresh performance
jorbuedo Dec 4, 2025
09ab13e
Update
jorbuedo Dec 5, 2025
d2ce485
renable banner
jorbuedo Dec 5, 2025
71bf8b2
fix
jorbuedo Dec 5, 2025
4e945c1
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Dec 5, 2025
b31a771
feat: refactor airdrop feature with API integration, caching, and bug…
jorbuedo Dec 6, 2025
2f85c3e
feat: add remove option for external addresses and clean up logs
jorbuedo Dec 6, 2025
a11b9d4
feat: add remove option for external addresses and clean up logs
jorbuedo Dec 6, 2025
25f57db
straglers
jorbuedo Dec 6, 2025
25229f5
remove charts
jorbuedo Dec 6, 2025
2411acf
redeem via review
jorbuedo Dec 6, 2025
359f89b
feat: improve message signing and verification flow
jorbuedo Dec 6, 2025
ebc8221
fix: improve back button navigation for nested navigators
jorbuedo Dec 6, 2025
46089fd
fix test
jorbuedo Dec 6, 2025
8f3e993
Address gen (#4403)
jorbuedo Dec 7, 2025
5320769
fix: fix manual address modal input focus and state reset issues
jorbuedo Dec 7, 2025
6d9cc99
chore: update i18n strings and related components
jorbuedo Dec 7, 2025
aef8242
fix
jorbuedo Dec 7, 2025
7512a3d
fix
jorbuedo Dec 7, 2025
692cc5b
feat: enhance airdrop screen with multiple manual addresses and info …
jorbuedo Dec 8, 2025
7e1feba
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Dec 9, 2025
1f28b2b
fix
jorbuedo Dec 9, 2025
4855b09
remove mint
jorbuedo Dec 9, 2025
e9d7a9d
improvement
jorbuedo Dec 9, 2025
8b1ad9e
staking update modal
jorbuedo Dec 9, 2025
d524dce
Merge branch 'staking-update' into mobile-experimental
jorbuedo Dec 9, 2025
38477e7
remove unused
jorbuedo Dec 9, 2025
ea2cde4
fix: correct storage persistence for staking update modal
jorbuedo Dec 9, 2025
7f104dd
remvoe preview
jorbuedo Dec 9, 2025
3c2ba87
remove withdraw+drep delegation option since it's not supported by th…
jorbuedo Dec 9, 2025
bd92113
fix: improve Discover search functionality and UI
jorbuedo Dec 9, 2025
8249b85
fix: use parseBoolean for storage boolean values
jorbuedo Dec 9, 2025
8589ce4
fix warning copy
jorbuedo Dec 9, 2025
3511c13
reduce coverage
jorbuedo Dec 9, 2025
a203bde
fix
jorbuedo Dec 9, 2025
85098ce
fix: improve modal keyboard dismissal to close in single tap
jorbuedo Dec 9, 2025
88fe7ca
add learn more url for staking updates
jorbuedo Dec 9, 2025
cf58f6e
fix
jorbuedo Dec 9, 2025
d4e92f6
feat: improve Byron wallet support and fix send all ADA
jorbuedo Dec 9, 2025
26adfe7
feat: improve airdrop redeem flow with logging and UI updates
jorbuedo Dec 10, 2025
12ae098
fix banner units
jorbuedo Dec 10, 2025
1e6d1ab
fix
jorbuedo Dec 10, 2025
c488915
fix: handle insufficient funds errors in airdrop redeem flow
jorbuedo Dec 10, 2025
b10e2ed
add dynamic app icons doc
jorbuedo Dec 10, 2025
8be790e
feat: increase address discovery gap limit from 20 to 40
jorbuedo Dec 10, 2025
9b27c5c
Merge remote-tracking branch 'origin/develop' into mobile-experimental
jorbuedo Dec 10, 2025
d5b777f
fix after merging dev
jorbuedo Dec 10, 2025
fa4759f
fix lint
jorbuedo Dec 10, 2025
14de743
fix cached thaws
jorbuedo Dec 10, 2025
03e76a1
fix: airdrop redeem flow - sign transaction with preventSubmit and na…
jorbuedo Dec 11, 2025
05a1a37
fix(dapp): remove preventSubmit flag to enable automatic transaction …
jorbuedo Dec 11, 2025
15a470c
feat: Add NIGHT redemption transaction detection and direction-based …
jorbuedo Dec 11, 2025
00eb8c9
fix: hardware wallet withdrawal requires KEY_PATH in ORDINARY_TRANSAC…
jorbuedo Dec 11, 2025
6718a54
fix cycles and types
jorbuedo Dec 11, 2025
399bf4f
interface to types
jorbuedo Dec 11, 2025
19f0f51
fix
jorbuedo Dec 11, 2025
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
  •  
  •  
  •  
662 changes: 662 additions & 0 deletions docs/extension-greenfield-migration-plan.md

Large diffs are not rendered by default.

1,203 changes: 1,203 additions & 0 deletions docs/multi-chain-integration-plan.md

Large diffs are not rendered by default.

102 changes: 102 additions & 0 deletions mobile/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,115 @@ module.exports = {
'react/no-unstable-nested-components': ['error', {allowAsProps: true}],
'eqeqeq': 'off',
'prettier/prettier': 'error',
// Forbid 'any' type - requires explicit exception comment
'@typescript-eslint/no-explicit-any': [
'error',
{
fixToUnknown: false,
ignoreRestArgs: false,
},
],
// Forbid 'class' keyword - requires explicit exception comment
'no-restricted-syntax': [
'error',
{
selector: 'ClassDeclaration',
message:
'Classes are forbidden. Use factory functions or functional patterns instead. Add eslint-disable comment with explanation if exception needed.',
},
{
selector: 'ClassExpression',
message:
'Classes are forbidden. Use factory functions or functional patterns instead. Add eslint-disable comment with explanation if exception needed.',
},
{
selector: 'CallExpression[callee.type="Import"]',
message:
'Dynamic imports are forbidden. Use static imports instead. Add eslint-disable comment with explanation if exception needed.',
},
],
// Forbid 'require' statements - requires explicit exception comment
'@typescript-eslint/no-require-imports': 'error',
'@typescript-eslint/no-var-requires': 'error',
},
overrides: [
{
files: ['metro.config.js', '.eslintrc.js'],
parserOptions: {
requireConfigFile: false,
},
rules: {
// Allow require in config files
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-var-requires': 'off',
},
},
{
files: ['**/*.d.ts'],
rules: {
// Type definition files often need 'any' and classes for third-party library compatibility
'@typescript-eslint/no-explicit-any': 'off',
'no-restricted-syntax': 'off',
},
},
{
files: [
'**/*.test.ts',
'**/*.test.tsx',
'**/*.spec.ts',
'**/*.spec.tsx',
'**/*.mock.ts',
'**/*.mock.tsx',
'**/mocks.ts',
'**/mocks.tsx',
'**/mocks/**/*.ts',
'**/mocks/**/*.tsx',
'**/__mocks__/**/*.ts',
'**/__mocks__/**/*.tsx',
],
rules: {
// Test and mock files can use 'any' for flexibility in testing scenarios
'@typescript-eslint/no-explicit-any': 'off',
// Test files can use classes for mocking and test utilities
'no-restricted-syntax': 'off',
// Test files can use require for dynamic test data loading
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-var-requires': 'off',
},
},
{
files: ['packages/types/index.ts'],
rules: {
// Error classes in namespace exports are allowed (they extend from centralized error classes)
'no-restricted-syntax': [
'error',
{
selector: 'ClassDeclaration:not([superClass])',
message:
'Classes are forbidden. Use factory functions or functional patterns instead. Add eslint-disable comment with explanation if exception needed.',
},
{
selector: 'ClassExpression:not([superClass])',
message:
'Classes are forbidden. Use factory functions or functional patterns instead. Add eslint-disable comment with explanation if exception needed.',
},
{
selector: 'CallExpression[callee.type="Import"]',
message:
'Dynamic imports are forbidden. Use static imports instead. Add eslint-disable comment with explanation if exception needed.',
},
],
},
},
{
files: [
'packages/staking/governance/api.ts',
'packages/staking/governance/manager.ts',
],
rules: {
// Implementation classes wrapped by factory functions - TODO: refactor to closures
'no-restricted-syntax': 'off',
},
},
],
}
83 changes: 69 additions & 14 deletions mobile/App.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import {AsyncStorageProvider} from '@yoroi/common'
import {LinksProvider} from '@yoroi/links'
import {
ResolverProvider,
resolverApiMaker,
resolverManagerMaker,
resolverStorageMaker,
} from '@yoroi/resolver'
import {SetupWalletProvider} from '@yoroi/setup-wallet'
import {
CatalystProvider,
Expand All @@ -8,18 +14,30 @@ import {
} from '@yoroi/staking'
import {ThemeProvider} from '@yoroi/theme'
import {TransferProvider} from '@yoroi/transfer'
import {Resolver} from '@yoroi/types'
import {
AutomaticWalletOpenerProvider,
WalletManagerHydrationWrapper,
WalletManagerProvider,
makeWalletManager,
useSelectedNetwork,
} from '@yoroi/wallet-manager'

import {init} from '@emurgo/cross-csl-mobile'
import * as Sentry from '@sentry/react-native'
import * as Updates from 'expo-updates'
import * as React from 'react'

import {useFonts} from '~/common/hooks/useFonts'
import {networkManagers} from '~/common/network-managers'
import {createCardanoWalletDependencies} from '~/common/wallet-dependencies'
import {BrowserProvider} from '~/features/Discover/common/BrowserProvider'
import {PortfolioTokenActivityProvider} from '~/features/Portfolio/context/PortfolioTokenActivityProvider'
import {ReceiveProvider} from '~/features/Receive/common/ReceiveProvider'
import {ReviewTxProvider} from '~/features/ReviewTx/common/ReviewTxProvider'
import {isDev} from '~/kernel/constants'
import {logger} from '~/kernel/logger/logger'
import {AppNavigator} from '~/kernel/navigation/AppNavigator'
import {Keychain} from '~/kernel/storage/Keychain'
import {Boundary} from '~/ui/Boundary/Boundary'
import {Modal} from '~/ui/Modal/ui/screens/Modal/Modal'
import {ScrollViewProvider} from '~/ui/ScrollView/context/ScrollViewContext'
Expand All @@ -31,12 +49,8 @@ import {YoroiNotificationManager} from './src/features/Notifications/common/Yoro
import {PairingProvider} from './src/features/Pairing/context/PairingProvider'
import {SearchProvider} from './src/features/Search/SearchContext'
import {CurrencyProvider} from './src/features/Settings/context/CurrencyProvider'
import {AutomaticWalletOpenerProvider} from './src/features/WalletManager/context/AutomaticWalletOpeningProvider'
import {WalletManagerHydrationWrapper} from './src/features/WalletManager/context/WalletManagerHydrationWrapper'
import {WalletManagerProvider} from './src/features/WalletManager/context/WalletManagerProvider'
import {walletManager} from './src/features/WalletManager/wallet-manager'
import {useFonts} from './src/hooks/useFonts'
import {ConnectionProvider} from './src/kernel/connection/ConnectionProvider'
import {unstoppableApiKey} from './src/kernel/constants'
import {LanguageProvider} from './src/kernel/i18n/LanguageProvider'
import {useMigrations} from './src/kernel/storage/migrations/useMigrations'
import {
Expand All @@ -56,6 +70,14 @@ const catalystManager = catalystManagerMaker({
api: catalystApi,
})

// Create wallet manager instance with app-specific dependencies
const walletManager = makeWalletManager({
networkManagers,
rootStorage,
keychainManager: Keychain,
cardanoWalletDependencies: createCardanoWalletDependencies(),
})

function AppShell({children}: React.PropsWithChildren) {
const isMigrated = useMigrations(rootStorage)
const isLoaded = useFonts()
Expand Down Expand Up @@ -94,10 +116,10 @@ function BusinessShell({children}: React.PropsWithChildren) {
<PairingProvider currencyStorageKeyManager={currencyStorageKeyManager}>
<WalletManagerHydrationWrapper walletManager={walletManager}>
<WalletManagerProvider walletManager={walletManager}>
<PortfolioTokenActivityProvider>
<AutomaticWalletOpenerProvider>
<TransferProvider>
<ReviewTxProvider>
<ResolverProviderWrapper>
<PortfolioTokenActivityProvider>
<AutomaticWalletOpenerProvider>
<TransferProvider>
<SetupWalletProvider>
<BrowserProvider>
<LinksProvider>
Expand All @@ -111,10 +133,10 @@ function BusinessShell({children}: React.PropsWithChildren) {
</LinksProvider>
</BrowserProvider>
</SetupWalletProvider>
</ReviewTxProvider>
</TransferProvider>
</AutomaticWalletOpenerProvider>
</PortfolioTokenActivityProvider>
</TransferProvider>
</AutomaticWalletOpenerProvider>
</PortfolioTokenActivityProvider>
</ResolverProviderWrapper>
</WalletManagerProvider>
</WalletManagerHydrationWrapper>
</PairingProvider>
Expand All @@ -123,6 +145,39 @@ function BusinessShell({children}: React.PropsWithChildren) {
)
}

// ResolverProvider wrapper that uses the selected network
// This provides resolver functionality to both SetupWallet and Send flows
const ResolverProviderWrapper = ({children}: React.PropsWithChildren) => {
const {networkManager} = useSelectedNetwork()
const isMainnet = networkManager.isMainnet

const resolverStorage = React.useMemo(() => {
return resolverStorageMaker()
}, [])

const resolverApi = React.useMemo(() => {
return resolverApiMaker({
apiConfig: {
[Resolver.NameServer.Unstoppable]: {
apiKey: unstoppableApiKey,
},
},
cslFactory: init,
isMainnet,
})
}, [isMainnet])

const resolverManager = React.useMemo(() => {
return resolverManagerMaker(resolverStorage, resolverApi)
}, [resolverStorage, resolverApi])

return (
<ResolverProvider resolverManager={resolverManager}>
{children}
</ResolverProvider>
)
}

async function checkForUpdates() {
try {
const update = await Updates.checkForUpdateAsync()
Expand Down
14 changes: 2 additions & 12 deletions mobile/PlatformShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,27 @@ import {
initialWindowMetrics,
} from 'react-native-safe-area-context'

import {BackgroundTimerProvider} from '~/common/providers/BackgroundTimerContext'
import {AnalyticsRootProvider} from '~/features/Analytics/context/AnalyticsRootProvider'
import {routeToEvent} from '~/features/Analytics/events/route-events'
import {createPosthogClient} from '~/features/Analytics/helpers/createPosthogClient'
import {useAnalyticsTracking} from '~/features/Analytics/hooks/useAnalyticsTracking'
import {useScreenCapture} from '~/features/Settings/hooks/useScreenCapture'
import {RouterContainer} from '~/kernel/navigation/RouterContainer'
import {
initInstallationId,
metricsEnabledStorageKeyManager,
} from '~/kernel/storage/storages'
import {ModalProvider} from '~/ui/Modal/context/ModalContext'

import {BackgroundTimerProvider} from './src/hooks/BackgroundTimerContext'

export function PlatformShell({children}: React.PropsWithChildren) {
const [metricsEnabled, setMetricsEnabled] = React.useState<boolean>(
metricsEnabledStorageKeyManager.read(),
)

const {init} = useScreenCapture()

const isAndroid = Platform.OS === 'android'
const platform = isAndroid ? 'Android' : 'IOS'
const client = usePosthogClient(metricsEnabled)

React.useEffect(() => {
init()
})

return (
<SafeAreaProvider initialMetrics={initialWindowMetrics}>
<AnalyticsRootProvider
Expand All @@ -48,9 +40,7 @@ export function PlatformShell({children}: React.PropsWithChildren) {
<TrackedRouterContainer>
<ModalProvider>
<BackgroundTimerProvider active={isAndroid}>
<KeyboardProvider statusBarTranslucent>
{children}
</KeyboardProvider>
<KeyboardProvider>{children}</KeyboardProvider>
</BackgroundTimerProvider>
</ModalProvider>
</TrackedRouterContainer>
Expand Down
36 changes: 36 additions & 0 deletions mobile/app.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
const baseConfig = require('./app.json')

// Determine if this is a development build
// Development builds use different bundle IDs so they can coexist with production
const isProduction =
process.env.EAS_BUILD_PROFILE === 'production' ||
process.env.EXPO_PUBLIC_BUILD_VARIANT === 'PROD'
const isPreview =
process.env.EAS_BUILD_PROFILE === 'preview' ||
process.env.EXPO_PUBLIC_BUILD_VARIANT === 'NIGHTLY'
const isDevelopment =
process.env.EAS_BUILD_PROFILE === 'development' ||
process.env.EXPO_PUBLIC_BUILD_VARIANT === 'DEV' ||
(!isProduction && !isPreview) // Default to dev for local builds
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: PREVIEW build variant uses wrong bundle identifier

The isPreview check only matches EXPO_PUBLIC_BUILD_VARIANT === 'NIGHTLY', but per src/kernel/constants.ts, 'PREVIEW' is also a valid preview variant (isPreview = buildVariant === 'PREVIEW'). When EXPO_PUBLIC_BUILD_VARIANT is set to 'PREVIEW', neither isProduction nor isPreview will be true, causing isDevelopment to become true via the fallback logic. This results in preview builds incorrectly using development bundle identifiers (com.emurgo.yoroi.dev / com.emurgo.dev) instead of production identifiers.

Fix in Cursor Fix in Web

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Preview build may use development bundle identifiers

The logic for determining isDevelopment falls back to true when neither isProduction nor isPreview is true. However, this means preview builds (which set isPreview to true) will correctly not be treated as development. But the issue is that if someone runs a local build without any env variables, it defaults to development mode which changes the bundle identifier. This is likely intentional for local builds, but worth noting that the isPreview variable is computed but never used in the configuration - preview builds will get production bundle identifiers but aren't explicitly handled.

Fix in Cursor Fix in Web

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Build variant checks are not mutually exclusive

The isDevelopment variable can be true even when isProduction is true. If EAS_BUILD_PROFILE === 'production' but a stale or misconfigured EXPO_PUBLIC_BUILD_VARIANT === 'DEV' is present, both isProduction and isDevelopment will evaluate to true. Since only isDevelopment is used for determining bundle identifiers, this could cause a production build to use development bundle IDs (com.emurgo.yoroi.dev / com.emurgo.dev), which would be a serious deployment issue. The check for isDevelopment needs to explicitly exclude production and preview builds.

Fix in Cursor Fix in Web


module.exports = {
expo: {
...baseConfig.expo,
// Change app name for development builds
name: isDevelopment ? 'Yoroi Dev' : baseConfig.expo.name,
ios: {
...baseConfig.expo.ios,
// Use different bundle identifier for development builds
bundleIdentifier: isDevelopment
? 'com.emurgo.yoroi.dev'
: baseConfig.expo.ios.bundleIdentifier,
},
android: {
...baseConfig.expo.android,
// Use different package name for development builds
package: isDevelopment
? 'com.emurgo.dev'
: baseConfig.expo.android.package,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Android dev package name inconsistent with iOS pattern

The Android development package name com.emurgo.dev doesn't follow the same naming pattern as the iOS bundle identifier com.emurgo.yoroi.dev. For iOS, the dev build adds .dev suffix to the full bundle identifier, but for Android it replaces com.emurgo with com.emurgo.dev, losing the yoroi component. This inconsistency could cause issues with Firebase, deep linking, or other services that expect matching identifiers across platforms.

Fix in Cursor Fix in Web

},
},
}
12 changes: 12 additions & 0 deletions mobile/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@
"bundleIdentifier": "com.emurgo.yoroi",
"associatedDomains": ["applinks:yoroi-wallet.com"],
"infoPlist": {
"CFBundleURLTypes": [
{
"CFBundleURLSchemes": ["yoroi", "web+cardano"]
}
],
"NSCameraUsageDescription": "Allow $(PRODUCT_NAME) to access your camera to scan QR codes",
"NSPhotoLibraryUsageDescription": "Allow $(PRODUCT_NAME) to access your photo library to import wallet data and QR codes",
"NSLocationWhenInUseUsageDescription": "Allow $(PRODUCT_NAME) to access your location for Bluetooth scanning",
Expand Down Expand Up @@ -88,6 +93,13 @@
"pathPrefix": "/w1"
},
"autoVerify": true
},
{
"action": "VIEW",
"category": ["DEFAULT", "BROWSABLE"],
"data": {
"scheme": "web+cardano"
}
}
],
"splash": {
Expand Down
Binary file added mobile/assets/img/governance-banner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading