Skip to content

Commit 1c95ee4

Browse files
piyalbasuaristidesstaffieridependabot[bot]leofelix077CassioMG
authored
Feature/contact book UI (#2612)
* [FEATURE] Hide collectible (#2510) * Bump axios from 1.11.0 to 1.13.2 (#2368) Bumps [axios](https://github.com/axios/axios) from 1.11.0 to 1.13.2. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](axios/axios@v1.11.0...v1.13.2) --- updated-dependencies: - dependency-name: axios dependency-version: 1.13.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump webpack-dev-server from 5.1.0 to 5.2.1 (#2367) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 5.1.0 to 5.2.1. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](webpack/webpack-dev-server@v5.1.0...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump js-yaml from 4.1.0 to 4.1.1 (#2384) Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](nodeca/js-yaml@4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Feature/collectibles home tab (#2405) * Feature/move icons to own hook (#2308) * move get icons out of critical path; rely on background's cache * add tests and comments * add comment * add comment * only dispatch if we have cached icons * PR comments * [FEATURE] adds send and swap buttons to asset detail view (#2351) * adds send and swap buttons to asset detail view * uses secondary button styles * removes run snapshots job (#2355) * release/5.35.4 (#2354) * upgrade to ledger-hq/hw-transport-webhid (#2350) * upgrade to ledger-hq/hw-transport-webhid * add tests * add ledger support for new trustline flow (#2352) * upgrade to ledger-hq/hw-transport-webhid * add ledger support for new trustline flow * only re-fetch balances if we were successful * test for fetching balances on success * add reset spys * adjust spacing at top of hw wallet modal * Now that `Done` button properly shows, click it in tests (#2356) * skip flakey test * skip flakey test * renames local vars to follow convention * adds tests for LP share and tweaks LP title * adds links with query params for asset detail CTAs --------- Co-authored-by: Piyal Basu <pbasu235@gmail.com> * first pass at showing collectibles in UI * add metadata fetching * add tests for metadata * check for owner of collectibles and test * add empty placeholder and add comments; rm placeholder values * rm captureException * rm duplicated tests added by rebase * pr comments * make non-square nft's cover; only show `collectibles` tab on non-custom network * attempt to clean up flakey e2e tests * rollback parallel testing * removing testing data * update tests --------- Co-authored-by: aristides <aristides.staffieri@stellar.org> * Feature/add collectibles (#2423) * Add Collectible UI * add localstorage and caching; add tests * add clipboardRead access for extension * rm consoles and add screenshot * rm console log * PR comments * fix conflict from rebase * fix typo; rm console.log * rename ManageCollectibles to AddCollectibles; finish `collectibleContractAddress` rename * fix tests * fix e2e test * update placeholder string * [BUG] fixes settings state persistence for asset selection in send and swap flows (#2420) * fixes settings state persistence for asset selection in send and swap flows * simplifies selection logic in e2e tests * tweaks role selector for test btn * adds mocks to new send payment tests for common api paths * uses correct login method for new test cases * fixes back button locators across all new tests, tweaks selector for final default state assertions * resets asset selection only on exit of send flow * adjust send payment settings e2e tests for correct state after asset navigation * Add memo-required flows for Dapp + Normal send (#2400) * Feature/move history fetch to bg (#2273) * upgrade to yarn 2 and use resolutions to block vulnerable package versions (#2239) * upgrade to yarn 2 and use resolutions to block vulnerable package versions * rm deprecated .yarnrc * rm yarnpath * try committing yarn binary to repo * try corepack enable for gha * update run tests cmd * rm yarnpath * rm npm i yarn * update all pipelines * rm superfluous history types * ensure invoke host function tx shows contract parameters (#2243) * ensure invoke host function tx shows contract parameters * add test for fallback if contract spec retrieval fails * Bugfix/rm auth param names (#2244) * ensure invoke host function tx shows contract parameters * add test for fallback if contract spec retrieval fails * do not show contract parameters for authorizations * add tests for create contract v1 and invoke contract * add issuer for changeTrust op (#2246) * add issuer for changeTrust op * programmatically disable overflow:hidden when copying a value * Revert "add issuer for changeTrust op (#2246)" (#2247) This reverts commit 19c8a68. * Bugfix/add issuer for changetrust (#2249) * ensure invoke host function tx shows contract parameters * add test for fallback if contract spec retrieval fails * do not show contract parameters for authorizations * add tests for create contract v1 and invoke contract * add issuer for changeTrust op * programmatically disable overflow:hidden when copying a value * cache account balances and poll for updates * fix CI tests * rm `force:true` which was causing action to happen too fast * do a fresh balance fetch on account/network change * first pass at async history * pr comments * allow for history caching * add more sentry tracking for Account and Wallets views (#2268) * add more sentry tracking for Account and Wallets views * adding more sentry reporting * gracefully degrade on errors from Blockaid (#2269) * gracefully degrade on errors from Blockaid * should not be necessary to skip dapp scanning on custom network * rm extra dep * add a test for persisting configurations in the send flow (#2271) * add a test for persisting configurations in the send flow * rm logs and update muxed acct; lower xlm payment * rm slow loading simulation * handle missing scan-tx result; add disabled state for Confirm Anyway (#2272) * handle missing scan-tx result; add disabled state for Confirm Anyway * assertions to show correct confirm button on Blockaid error * add cache for balances to ensure we do a fresh lookup when needed (#2275) * add cache for balances to ensure we do a fresh lookup when needed * add try...catch to token-prices polling * rm log * only dispatch saveBalancesForAccount when fresh data has been fetched * adjust test to wait for UI change * replace yarn setup with just yarn * rm unnecessary return * clear token details on redux clear action * make history row construction async and check for redux state for updates * add tests for assetdetails * increase timeout for flakey test * pr comments * refresh account history every time account balances refresh * check for updated appdata before showing password modal (#2300) * check for updated appdata before showing password modal * update error msg * rm unused redirect logic * stringify errors rather than using `cause` (#2302) * Feature/move icons to own hook (#2308) * move get icons out of critical path; rely on background's cache * add tests and comments * add comment * add comment * only dispatch if we have cached icons * PR comments * skip blockaid scan on first fetch of account-balances (#2310) * skip blockaid scan on first fetch of account-balances * rm stub change * rm more stubs * rm log * add comments and update boolean naming * Dropdown menu option to copy wallet address (#2316) * add button to copy address from dropdown * Added translations * revert translation file changes * revert translation file changes * Added translations * revert changes to translation files * move copy address button to first dropdown position * scroll on long strings; pretty print json (#2320) * scroll on long strings; pretty print json * rm log * add correct snapshot for json message * rm log * finish comment * add error case for JSON * don't use carat for lib * update yarn.lock * move scrollbar to btm of container; reduce json font size * update snapshot * re-searching so should abort any in flight API requests (#2323) * re-searching so should abort any in flight API requests * add comment * fix test name * make test more reliable * add check for correct search results * fix jest locator * [FEATURE] new send/swap navigation flow (#2353) * adds SelectionTile and AddressTile, updates nav flows to match updates. Adds query parameter for default values in send flow * Added translations * adds address tile and uses it in swap flow, tweaks selection tile styles * adds unit tests for new tile components * Added translations * updates swap navigation flow to match updates, updates tests flows to match * updates back icon for send and swap steps, fixes bad test references * tweaks locator in address tile tests * adds store state to asset tile tests, removes asset icon mock * updates SelectionTile prop name, adds isSuspicious prop for AssetTile * adds placeholder value in TokenList for missing token USD value * uses real IdenticonImg in address tile unit tests * adds query param validation for send and swap flow * Update extension/src/popup/views/SendPayment/index.tsx Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * adds missing import * adds class for tile icon --------- Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * [FEATURE] adds send and swap buttons to asset detail view (#2351) * adds send and swap buttons to asset detail view * uses secondary button styles * removes run snapshots job (#2355) * release/5.35.4 (#2354) * upgrade to ledger-hq/hw-transport-webhid (#2350) * upgrade to ledger-hq/hw-transport-webhid * add tests * add ledger support for new trustline flow (#2352) * upgrade to ledger-hq/hw-transport-webhid * add ledger support for new trustline flow * only re-fetch balances if we were successful * test for fetching balances on success * add reset spys * adjust spacing at top of hw wallet modal * Now that `Done` button properly shows, click it in tests (#2356) * skip flakey test * skip flakey test * renames local vars to follow convention * adds tests for LP share and tweaks LP title * adds links with query params for asset detail CTAs --------- Co-authored-by: Piyal Basu <pbasu235@gmail.com> * only fetch asset list data if needed (#2369) * only fetch asset list data if needed * correctly show icon loading state * [BUG] SAC token management improvements (#2374) * adds SAC detection when changing trust in the add and remove token flows * updates arg signature for isAssetSac * Feature/cache token prices (#2373) * cache token prices and batch loading wallets * use similar methodology for token price and account balance caching * fix loading state trigger * fix tests * use helper for cache clearing * set isFetchingTokenPrices to false in catch handler * rollback error change * load backend settings async on Account view (#2381) * load backend settings async on Account view * rm console.logs * Feature/use ledger key for home domains (#2363) * use ledger-key/accounts endpoint for home domains * fix tests * create generic ledger key account helper; add tests * rm unneeded data-test prop * rm unused import * [CHORE] git process updates (#2361) * moves the add translations hook to the pre commit stage, removes standalone translations commit * adds script to update app version, removes version update from submit production action, adds update version step to test run action for release branches * removes version input, now uses package version * fetch asset domains in one calls * fix tests * cache home domains while iterating over account history rows * fitler non-G keys * rm .only * fix test param * PR comments --------- Co-authored-by: aristides <aristides.staffieri@stellar.org> * update version numbers for release * rm unnecessary calls to make flows even faster (#2391) * makes send swap buttons stay in the container in full screen mode (#2392) * makes send swap buttons stay in the container in full screen mode * add a pause to make sure flakey e2e test has time to save changes * add v1 of memo-required flow for transaction confirmation * adjust memo required flow for dapp and tx rebuild * add memo max bytes error handling * update transaction loose text strings * update transaction loose text strings * update tranlation with uppercase * fix transaction fee setting * adjust memo required on revalidation and add a container for message * update memo-required flow to slide from right * update translation keys and memo required panes * use redux selector for allAccounts to properly update rename (#2403) * use redux selector for allAccounts to properly update rename * add longer timeout for flakey btn * fix unit tests * revert test case change * adjust sending user back to review sheet on add memo only * add e2e tests for memo required flows * fix add memo back and forth test * simplify comments and logic for memo required check --------- Co-authored-by: Piyal Basu <pbasu235@gmail.com> Co-authored-by: aristides <aristides.staffieri@stellar.org> Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * Update PT Translations and usage (#2404) * Feature/move history fetch to bg (#2273) * upgrade to yarn 2 and use resolutions to block vulnerable package versions (#2239) * upgrade to yarn 2 and use resolutions to block vulnerable package versions * rm deprecated .yarnrc * rm yarnpath * try committing yarn binary to repo * try corepack enable for gha * update run tests cmd * rm yarnpath * rm npm i yarn * update all pipelines * rm superfluous history types * ensure invoke host function tx shows contract parameters (#2243) * ensure invoke host function tx shows contract parameters * add test for fallback if contract spec retrieval fails * Bugfix/rm auth param names (#2244) * ensure invoke host function tx shows contract parameters * add test for fallback if contract spec retrieval fails * do not show contract parameters for authorizations * add tests for create contract v1 and invoke contract * add issuer for changeTrust op (#2246) * add issuer for changeTrust op * programmatically disable overflow:hidden when copying a value * Revert "add issuer for changeTrust op (#2246)" (#2247) This reverts commit 19c8a68. * Bugfix/add issuer for changetrust (#2249) * ensure invoke host function tx shows contract parameters * add test for fallback if contract spec retrieval fails * do not show contract parameters for authorizations * add tests for create contract v1 and invoke contract * add issuer for changeTrust op * programmatically disable overflow:hidden when copying a value * cache account balances and poll for updates * fix CI tests * rm `force:true` which was causing action to happen too fast * do a fresh balance fetch on account/network change * first pass at async history * pr comments * allow for history caching * add more sentry tracking for Account and Wallets views (#2268) * add more sentry tracking for Account and Wallets views * adding more sentry reporting * gracefully degrade on errors from Blockaid (#2269) * gracefully degrade on errors from Blockaid * should not be necessary to skip dapp scanning on custom network * rm extra dep * add a test for persisting configurations in the send flow (#2271) * add a test for persisting configurations in the send flow * rm logs and update muxed acct; lower xlm payment * rm slow loading simulation * handle missing scan-tx result; add disabled state for Confirm Anyway (#2272) * handle missing scan-tx result; add disabled state for Confirm Anyway * assertions to show correct confirm button on Blockaid error * add cache for balances to ensure we do a fresh lookup when needed (#2275) * add cache for balances to ensure we do a fresh lookup when needed * add try...catch to token-prices polling * rm log * only dispatch saveBalancesForAccount when fresh data has been fetched * adjust test to wait for UI change * replace yarn setup with just yarn * rm unnecessary return * clear token details on redux clear action * make history row construction async and check for redux state for updates * add tests for assetdetails * increase timeout for flakey test * pr comments * refresh account history every time account balances refresh * check for updated appdata before showing password modal (#2300) * check for updated appdata before showing password modal * update error msg * rm unused redirect logic * stringify errors rather than using `cause` (#2302) * Feature/move icons to own hook (#2308) * move get icons out of critical path; rely on background's cache * add tests and comments * add comment * add comment * only dispatch if we have cached icons * PR comments * skip blockaid scan on first fetch of account-balances (#2310) * skip blockaid scan on first fetch of account-balances * rm stub change * rm more stubs * rm log * add comments and update boolean naming * Dropdown menu option to copy wallet address (#2316) * add button to copy address from dropdown * Added translations * revert translation file changes * revert translation file changes * Added translations * revert changes to translation files * move copy address button to first dropdown position * scroll on long strings; pretty print json (#2320) * scroll on long strings; pretty print json * rm log * add correct snapshot for json message * rm log * finish comment * add error case for JSON * don't use carat for lib * update yarn.lock * move scrollbar to btm of container; reduce json font size * update snapshot * re-searching so should abort any in flight API requests (#2323) * re-searching so should abort any in flight API requests * add comment * fix test name * make test more reliable * add check for correct search results * fix jest locator * [FEATURE] new send/swap navigation flow (#2353) * adds SelectionTile and AddressTile, updates nav flows to match updates. Adds query parameter for default values in send flow * Added translations * adds address tile and uses it in swap flow, tweaks selection tile styles * adds unit tests for new tile components * Added translations * updates swap navigation flow to match updates, updates tests flows to match * updates back icon for send and swap steps, fixes bad test references * tweaks locator in address tile tests * adds store state to asset tile tests, removes asset icon mock * updates SelectionTile prop name, adds isSuspicious prop for AssetTile * adds placeholder value in TokenList for missing token USD value * uses real IdenticonImg in address tile unit tests * adds query param validation for send and swap flow * Update extension/src/popup/views/SendPayment/index.tsx Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * adds missing import * adds class for tile icon --------- Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * [FEATURE] adds send and swap buttons to asset detail view (#2351) * adds send and swap buttons to asset detail view * uses secondary button styles * removes run snapshots job (#2355) * release/5.35.4 (#2354) * upgrade to ledger-hq/hw-transport-webhid (#2350) * upgrade to ledger-hq/hw-transport-webhid * add tests * add ledger support for new trustline flow (#2352) * upgrade to ledger-hq/hw-transport-webhid * add ledger support for new trustline flow * only re-fetch balances if we were successful * test for fetching balances on success * add reset spys * adjust spacing at top of hw wallet modal * Now that `Done` button properly shows, click it in tests (#2356) * skip flakey test * skip flakey test * renames local vars to follow convention * adds tests for LP share and tweaks LP title * adds links with query params for asset detail CTAs --------- Co-authored-by: Piyal Basu <pbasu235@gmail.com> * only fetch asset list data if needed (#2369) * only fetch asset list data if needed * correctly show icon loading state * [BUG] SAC token management improvements (#2374) * adds SAC detection when changing trust in the add and remove token flows * updates arg signature for isAssetSac * Feature/cache token prices (#2373) * cache token prices and batch loading wallets * use similar methodology for token price and account balance caching * fix loading state trigger * fix tests * use helper for cache clearing * set isFetchingTokenPrices to false in catch handler * rollback error change * load backend settings async on Account view (#2381) * load backend settings async on Account view * rm console.logs * Feature/use ledger key for home domains (#2363) * use ledger-key/accounts endpoint for home domains * fix tests * create generic ledger key account helper; add tests * rm unneeded data-test prop * rm unused import * [CHORE] git process updates (#2361) * moves the add translations hook to the pre commit stage, removes standalone translations commit * adds script to update app version, removes version update from submit production action, adds update version step to test run action for release branches * removes version input, now uses package version * fetch asset domains in one calls * fix tests * cache home domains while iterating over account history rows * fitler non-G keys * rm .only * fix test param * PR comments --------- Co-authored-by: aristides <aristides.staffieri@stellar.org> * update version numbers for release * rm unnecessary calls to make flows even faster (#2391) * makes send swap buttons stay in the container in full screen mode (#2392) * makes send swap buttons stay in the container in full screen mode * add a pause to make sure flakey e2e test has time to save changes * add v1 of memo-required flow for transaction confirmation * adjust memo required flow for dapp and tx rebuild * add memo max bytes error handling * update transaction loose text strings * update transaction loose text strings * update tranlation with uppercase * fix transaction fee setting * adjust memo required on revalidation and add a container for message * update memo-required flow to slide from right * update translation keys and memo required panes * use redux selector for allAccounts to properly update rename (#2403) * use redux selector for allAccounts to properly update rename * add longer timeout for flakey btn * add portuguese missing translations * adjust still missing PT translations * update last mismatching translation keys * add one more set of missing translations * extra set of missing function translations * extra set of missing function translations * extra set of missing function translations * fix unit tests * update e2e tests * delete unused files * add one more set of missing translations * add hwconnect, soroban and error translations * replace usage of curly quotes with normal quotes * break down long translation keys * remove pending duoplicate keys * fix nested translation keys * add translation for congestion * remove nested translation keys * remove nested translation keys * remove nested translation keys * adjust nested files and revert prettier config * adjust nested files and revert prettier config * adjust missing fee translation * remove duplicated keys * prevent webpack from removing translations * prevent webpack from removing translations * replace strings with interpolation * add back memo flow and update missing string interpolations * remove Address.json and interpolate keys * remove address.json * preserve translation namespaces * remove auto creation of address.json * prevent address namespace creation * fix failing tests cases * revert changes to sendPayment flow * adjust language setting on test fixtures * update account unfunded flaky test * revert test case change * adjust sending user back to review sheet on add memo only * add e2e tests for memo required flows * fix add memo back and forth test * merge base into branch * partial revert changes to tests * revert changes unrelated to translation on tests * revert changes unrelated to translations * remove custom logic from i18n webpack * remove interpolated forced spacing * simplify interpolated strings * add missing PT translations and smoke tests * adjust casing for unified translations * revert quotes back to curly quotes * simplify test fixtures for PT lang * revert quotes back to curly quotes * replace string concatenations with interpolation * revert strings to old forms with translation --------- Co-authored-by: Piyal Basu <pbasu235@gmail.com> Co-authored-by: aristides <aristides.staffieri@stellar.org> Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * Feature/collectible detail (#2451) * add CollectibleDetail UI * add popover and tests * adds additional testing * fetch only the metadata for the current detail * use state from hook * fix missing translations helpers * rm log * fix tests * test failing due to copy change * rm empty dir and fix test due to copy change * add shadcn sheet and use on asset/collectible detail (#2463) * Bump mdast-util-to-hast from 13.2.0 to 13.2.1 (#2421) Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases) - [Commits](syntax-tree/mdast-util-to-hast@13.2.0...13.2.1) --- updated-dependencies: - dependency-name: mdast-util-to-hast dependency-version: 13.2.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add collectibles to the Send flow * Revert "add collectibles to the Send flow" This reverts commit 175b086. * Add collectibles to send flow (#2473) * Reapply "add collectibles to the Send flow" This reverts commit be2a075. * fix incorrect fee * code cleanup * pr comments * check for found collectible * add unit tests * [CHORE] upgrades stellar sdk to latest version (#2480) * upgrades stellar sdk to latest version * upgrades sdk for remaining workspaces * tweaks history tests for current account state * adds action to hide a collectible, adds hidden collectible option in menu and hidden collectible sheet * fixes collectible detail z-index when nested, tweaks notification styles * fixes refresh collectibles state bug * extends account collectibles tests for hide and unhide changes. Adds unit and e2e tests for the hide and unhide functionality * refactor hidden collectibles callabck flow to avoid extra consumer coupling * combines common helpers for isCollectiblesHidden * refactors sheet usage to separate the body state from the open and closed state * ignores MCPs in git for now * fix: add missing isHidden prop and hidden collectibles integration * chore: remove local dev files from git tracking --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Piyal Basu <pbasu235@gmail.com> Co-authored-by: leofelix077 <leonardoaalf077@hotmail.com> Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> * fix: sign-transactions balances call should fail silently (#2564) * adds better handling of balance call failures to the sign transaction view. Tweaks logic for insufficient balance warning to degrade silently in case of balance failures. Adds test cases for balance failures in the sign transaction flow * uses constant for network passphrase for insufficient fee unit test * uses constant for network passphrase for remaining unit tests in sign-transaction * tweaks balances signature for null preference * fixes SAC check for add asset flow in submit transaction to correctly check for SAC assets in order to decide to add a token ID or change a trustline. Adds supporting unit tests. (#2567) * fix: restore hide collectibles button from previous rebase (#2574) * restore hide collectibles button in dropdown and bottom sheet interaction changes * restores original hide collectibles snapshots * regenerates snapshots for the hide collectibles e2e test suite * increases max diff ratio for snapshots to exclude small differences in font rendering and other OS details * tweak deviceScaleFactor and regenrate snapshots for collectibles to align viewport zoom between generations and CI snapshots * removes locally generated snapshots for hide collectibles, will be generated in CI to ensure OS and runtime matcgh * restores original pixel ratio diff max * removes viewport config for screen sizes and generates new snapshots for hide collectibles suite * removes snapshots from hide collectible suite * Make e2e tests more reliable (#2562) * refactor e2e tests for scalability * restore missing tests * remove extra stubbing * test context * test context * allow only * try moving context * test ci * try moving stub inside test * Revert "try moving stub inside test" This reverts commit 0f1dafa. * move inside login * try moving context inside login * try just 2 test * try a few more * try tests with ai tips * can we use multiple workers * reduce workers * try 3 workers * try larger machine * try more workers and fix flake * 5 workers * readd stubs; decrease workers * rm unused imports * fix integration tests * rm debugging stuff * add better documentation * copilot pr comments * fix flakey sendcollectibles tests * add readme * cherry pick previous restore-health-check commits (#2577) * cherry pick previous restore-health-check commits * updating shadcn dep * fix: validate HTTP status before caching API responses (#2603) * release/5.37.3 (#2601) * Bugfix/improve login (#2600) * bump iterations * generate unique iv * bump version numbers * Update extension/src/background/messageListener/__tests__/createAccount.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: validate HTTP status before caching API responses - Add res.ok check in cachedFetch before storing responses - Preserve existing cache when fetch returns HTTP errors - Add unit tests for cachedFetch error handling --------- Co-authored-by: Piyal Basu <pbasu235@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(grantAccess): validate queue item before setting allowlist (#2605) Move setAllowListDomain call after queue validation check to ensure domains are only added to the allowlist when a valid response queue item exists. Add comprehensive test coverage for grantAccess handler. * feat(background): add TTL-based cleanup for message queues (#2607) * feat(background): add TTL-based cleanup for message queues - Add createdAt timestamp to queue item types (ResponseQueueItem, TransactionQueueItem, BlobQueueItem, AuthEntryQueueItem, TokenQueueItem) - Create queueCleanup utility with cleanupQueue() and startQueueCleanup() - Set 5-minute TTL for queue items with 1-minute cleanup interval - Initialize periodic cleanup in popupMessageListener on module load - Update freighterApiMessageListener to include createdAt on all queue pushes - Update addToken handler for new TokenQueueItem structure - Add tests for queue cleanup functionality * reverts playwright config changes * feat(background): preserve queue items with open popups during TTL cleanup - Add MARK_QUEUE_ACTIVE service type and message handler - Add activeQueueUuids Set to track UUIDs with open popups - Update cleanupQueue to skip items in activeQueueUuids - Add markQueueActive internal API function - Add useMarkQueueActive hook to mark items active on mount/inactive on unmount - Integrate hook into SignTransaction, SignMessage, SignAuthEntry, AddToken, GrantAccess views - Add tests for active UUID tracking in cleanup and hook behavior * adds createdAt field to response queue mocks * adds missing imports and context for login * fix: normalize domain to punycode before allowlist check (#2604) * adds missing imports and context for login * fix: normalize domain to punycode before allowlist check The useIsDomainListedAllowed hook was comparing raw domain strings against the allowlist, but grantAccess stores domains as punycode. This caused IDN (internationalized domain names) to fail matching their stored punycode equivalents, requiring users to re-authorize legitimate IDN domains repeatedly. Convert the input domain to punycode before checking against the allowlist to ensure consistent matching. Add tests for: - useIsDomainListedAllowed hook with IDN/punycode matching - URL helper functions including getPunycodedDomain * Fix broken scroll on "Import wallet from recovery phrase" view (#2592) (#2608) Co-authored-by: Miguel Nieto <miguelnietoarias3@gmail.com> * first pass at contact book * add tests * expand contract id on screen width change (#2588) * Make e2e tests more reliable (#2562) * refactor e2e tests for scalability * restore missing tests * remove extra stubbing * test context * test context * allow only * try moving context * test ci * try moving stub inside test * Revert "try moving stub inside test" This reverts commit 0f1dafa. * move inside login * try moving context inside login * try just 2 test * try a few more * try tests with ai tips * can we use multiple workers * reduce workers * try 3 workers * try larger machine * try more workers and fix flake * 5 workers * readd stubs; decrease workers * rm unused imports * fix integration tests * rm debugging stuff * add better documentation * copilot pr comments * fix flakey sendcollectibles tests * add readme * expand contract id on screen width change * elaborate on comment * restore unrelated changes * Update extension/src/helpers/hooks/useIsWideScreen.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * pr comment * fix flakey test * fix another flakey test --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * disable swap button before user has selected dest (#2587) * use formik for fields * Handle Blockaid unable to scan state (#2435) * Handle blockaid unable-to-scan states - Add unable-to-scan handling for transaction, asset, and site scans - Show "Proceed with caution" warning when scans fail or return errors - Context-aware copy: distinguish "Unable to scan token" vs "Unable to scan transaction" - Add blockaid debug override panel in Debug view - Refactor ReviewTransaction into sub-components (ActionButtons, SendAsset, SendDestination) - Add security improvements: URL parameter encoding, isDev guards, Sentry privacy - Fix scanAssetBulk to return null instead of {} on error (fail-closed) - Remove duplicate render paths in BlockaidTxScanLabel - Add comprehensive e2e tests for blockaid scan states (safe, suspicious, malicious, unable, errors) - Add blockaid unit tests - Add i18n translations (en/pt) Co-Authored-By: Claude <noreply@anthropic.com> * revert changes to toaster * update UI and malicious case for add token * simplify double calls to blockaid override state * fix failing unit tests * adjust css styles to use sds vars --------- Co-authored-by: Claude <noreply@anthropic.com> * split out editContactCard component * Add accessible name to ContactBook header add button (#2613) * Initial plan * Add type="button" and aria-label to ContactBook header add button Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> * Add accessibility attributes to ContactBook actions trigger button (#2614) * Initial plan * Add aria-label and type="button" to contact actions trigger button Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> * update toast design * fix async validation * disable stubbed data and fix tests * add federation address tests * clean up toast implementation * polish the validation ux * Fix ContactBook unit tests: mock Toaster, update toast assertions, and fix federation test interactions - Add missing Toaster export to sonner mock so Toast component renders correctly - Update toast.success assertions to include toasterId property - Add validateOnMount to Formik so Save button is disabled on empty form - Add fireEvent.focus() before address input interactions in federation tests so activeFieldRef is set before blur triggers async validation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * rm unneeded helper * rm feature flags * rm comment * add better check for federated addresses * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(i18n): translate "Contact actions" to Portuguese in pt locale (#2644) * Initial plan * fix: translate "Contact actions" to Portuguese in pt/translation.json Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> * fix: harden Contact Book security and edge cases - Add federation timeout (10s) + AbortController to prevent UI freezes - Validate federation domains before network requests (SSRF mitigation) - Fix race condition in duplicate address check using stale resolved refs - Fix federation failure not persisting across field re-validation - Strip bidi/zero-width unicode characters from contact names - Trim address input to prevent whitespace-based duplicate bypass - Add 32-char max length for contact names - Use truncatedFedAddress for federation address display - Add dirty form check on modal backdrop dismiss - Extract validation schema into helpers/contactList.ts - Add missing i18n keys (en + pt) - Update tests for new validation and display logic Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * add missing dep * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * rm unused var * match valid domain regex to mobile's * fix type errors * fix(ContactBook): clear open menu on add, muxed identicon base address, federation resolution on Enter (#2658) * Initial plan * fix: clear menu on add, muxed identicon base address, federation resolution on Enter Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: aristides <aristides.staffieri@stellar.org> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: leofelix077 <leonardoaalf077@hotmail.com> Co-authored-by: Cássio Marcos Goulart <3228151+CassioMG@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Miguel Nieto <miguelnietoarias3@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: piyalbasu <6789586+piyalbasu@users.noreply.github.com>
1 parent 57143f7 commit 1c95ee4

18 files changed

Lines changed: 2103 additions & 8 deletions

File tree

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
import React from "react";
2+
import { object as YupObject, string as YupString } from "yup";
3+
import { Federation } from "stellar-sdk";
4+
5+
import {
6+
isValidStellarAddress,
7+
isFederationAddress,
8+
isValidFederatedDomain,
9+
} from "helpers/stellar";
10+
11+
export const FEDERATION_TIMEOUT_MS = 10_000;
12+
export const NAME_MAX_LENGTH = 32;
13+
14+
// Strip bidi control characters and zero-width characters that enable visual
15+
// spoofing — critical in a wallet context where contact names guide sends.
16+
const BIDI_AND_ZW_RE = /[\u200B-\u200F\u2028-\u202F\u2060-\u2069\uFEFF\u00AD]/g;
17+
18+
export const sanitizeName = (value: string) =>
19+
value.replace(BIDI_AND_ZW_RE, "");
20+
21+
/**
22+
* Resolves a federation address with a hard timeout and AbortController support.
23+
*/
24+
export const resolveFederationAddress = (
25+
address: string,
26+
signal?: AbortSignal,
27+
) =>
28+
Promise.race([
29+
Federation.Server.resolve(address),
30+
new Promise<never>((_, reject) => {
31+
const timer = setTimeout(
32+
() => reject(new Error("Federation resolution timed out")),
33+
FEDERATION_TIMEOUT_MS,
34+
);
35+
signal?.addEventListener("abort", () => {
36+
clearTimeout(timer);
37+
reject(new Error("Aborted"));
38+
});
39+
}),
40+
]);
41+
42+
// ---------------------------------------------------------------------------
43+
// Contact form validation schema
44+
// ---------------------------------------------------------------------------
45+
46+
interface ContactsMapEntry {
47+
name: string;
48+
resolvedAddress?: string;
49+
}
50+
51+
type ContactsMap = Record<string, ContactsMapEntry>;
52+
53+
/** Mutable refs the schema reads/writes during async federation validation. */
54+
export interface FederationRefs {
55+
resolvedAddress: React.RefObject<string | undefined>;
56+
lastResolvedInput: React.RefObject<string | undefined>;
57+
federationFailed: React.RefObject<boolean>;
58+
hasAddressBlurred: React.RefObject<boolean>;
59+
activeField: React.RefObject<string | null>;
60+
abortController: React.RefObject<AbortController | null>;
61+
isMounted: React.RefObject<boolean>;
62+
}
63+
64+
export interface ContactFormSchemaConfig {
65+
t: (key: string) => string;
66+
existingContacts: ContactsMap;
67+
refs: FederationRefs;
68+
setIsFetchingFederationAddress: (fetching: boolean) => void;
69+
}
70+
71+
export const createContactFormSchema = ({
72+
t,
73+
existingContacts,
74+
refs,
75+
setIsFetchingFederationAddress,
76+
}: ContactFormSchemaConfig) =>
77+
YupObject().shape({
78+
address: YupString()
79+
.required(t("Invalid Stellar address"))
80+
.trim()
81+
.test("is-valid-stellar-address", t("Invalid Stellar address"), (val) => {
82+
if (!val) return false;
83+
const trimmed = val.trim();
84+
if (isFederationAddress(trimmed)) {
85+
return isValidFederatedDomain(trimmed);
86+
}
87+
return isValidStellarAddress(trimmed);
88+
})
89+
.test(
90+
"is-not-federation-failure",
91+
t("Failed to resolve federated address"),
92+
async (val) => {
93+
if (!val) return true;
94+
const trimmed = val.trim();
95+
96+
if (!isFederationAddress(trimmed)) {
97+
refs.resolvedAddress.current = undefined;
98+
refs.lastResolvedInput.current = undefined;
99+
refs.federationFailed.current = false;
100+
return true;
101+
}
102+
103+
// Use cached result if we already resolved this exact value
104+
if (refs.lastResolvedInput.current === trimmed) {
105+
return refs.resolvedAddress.current !== undefined;
106+
}
107+
108+
refs.abortController.current?.abort();
109+
const controller = new AbortController();
110+
refs.abortController.current = controller;
111+
112+
if (refs.isMounted.current) {
113+
setIsFetchingFederationAddress(true);
114+
}
115+
116+
try {
117+
const fedResp = await resolveFederationAddress(
118+
trimmed,
119+
controller.signal,
120+
);
121+
122+
if (controller.signal.aborted) return true;
123+
124+
refs.resolvedAddress.current = fedResp.account_id;
125+
refs.lastResolvedInput.current = trimmed;
126+
refs.federationFailed.current = false;
127+
return true;
128+
} catch {
129+
if (controller.signal.aborted) return true;
130+
refs.resolvedAddress.current = undefined;
131+
refs.lastResolvedInput.current = undefined;
132+
refs.federationFailed.current = true;
133+
return false;
134+
} finally {
135+
if (refs.isMounted.current) {
136+
setIsFetchingFederationAddress(false);
137+
}
138+
}
139+
},
140+
)
141+
.test(
142+
"is-not-duplicate-address",
143+
t("This address already exists in your contacts"),
144+
(val) => {
145+
if (!val) return true;
146+
const trimmed = val.trim();
147+
148+
const rawDuplicate = Object.keys(existingContacts).some(
149+
(key) => key.toLowerCase() === trimmed.toLowerCase(),
150+
);
151+
if (rawDuplicate) return false;
152+
153+
const resolved = refs.resolvedAddress.current;
154+
if (resolved && refs.lastResolvedInput.current === trimmed) {
155+
const resolvedLower = resolved.toLowerCase();
156+
return !Object.entries(existingContacts).some(
157+
([key, contact]) =>
158+
key.toLowerCase() === resolvedLower ||
159+
contact.resolvedAddress?.toLowerCase() === resolvedLower,
160+
);
161+
}
162+
return true;
163+
},
164+
),
165+
name: YupString()
166+
.required(t("Name cannot be empty"))
167+
.trim()
168+
.max(NAME_MAX_LENGTH, t("Name is too long"))
169+
.test(
170+
"is-not-duplicate-name",
171+
t("This name already exists in your contacts"),
172+
(val) => {
173+
if (!val) return true;
174+
const sanitized = sanitizeName(val.trim());
175+
return !Object.values(existingContacts).some(
176+
(c) => c.name.toLowerCase() === sanitized.toLowerCase(),
177+
);
178+
},
179+
),
180+
});

extension/src/helpers/stellar.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,14 @@ export const isValidStellarAddress = (publicKey: string): boolean => {
245245
}
246246
};
247247

248-
export const isFederationAddress = (address: string) => address.includes("*");
248+
export const isFederationAddress = (address: string) => {
249+
const parts = address.split("*");
250+
return parts.length === 2 && parts[0].length > 0 && parts[1].length > 0;
251+
};
249252

250253
export const isValidDomain = (input: string) => {
251254
// eslint-disable-next-line no-useless-escape
252-
const domainRegex = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$/i;
255+
const domainRegex = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}$/i;
253256
if (domainRegex.test(input)) {
254257
return true;
255258
} else {

extension/src/popup/Router.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import { AccountMigration } from "popup/views/AccountMigration";
6262
import { AddFunds } from "popup/views/AddFunds";
6363
import { Discover } from "popup/views/Discover";
6464
import { Wallets } from "popup/views/Wallets";
65+
import { ContactBook } from "popup/views/ContactBook";
6566

6667
import { DEV_SERVER } from "@shared/constants/services";
6768
import { SettingsState } from "@shared/api/types";
@@ -71,6 +72,7 @@ import { SignMessage } from "./views/SignMessage";
7172
import { View } from "./basics/layout/View";
7273
import { AppDispatch } from "./App";
7374

75+
import { Toaster } from "./basics/shadcn/Toast";
7476
import "popup/metrics/views";
7577

7678
/*
@@ -170,6 +172,7 @@ export const Router = () => (
170172
index
171173
element={
172174
<ActiveTabProvider>
175+
<Toaster />
173176
<Account />
174177
</ActiveTabProvider>
175178
}
@@ -277,6 +280,7 @@ export const Router = () => (
277280
<Route path={ROUTES.addFunds} element={<AddFunds />} />
278281
<Route path={ROUTES.discover} element={<Discover />} />
279282
<Route path={ROUTES.wallets} element={<Wallets />} />
283+
<Route path={ROUTES.contactBook} element={<ContactBook />}></Route>
280284

281285
{DEV_SERVER && (
282286
<>

extension/src/popup/basics/shadcn/Toast/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ function Toaster({ ...props }: React.ComponentProps<typeof SonnerToaster>) {
1818
position="top-center"
1919
icons={{
2020
info: <Icon.InfoCircle />,
21+
success: <Icon.CheckCircle />,
22+
error: <Icon.XCircle />,
2123
}}
2224
{...props}
2325
/>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,78 @@
1+
@use "../../../styles/utils.scss" as *;
2+
13
.Toast {
24
li:before {
35
content: none !important;
46
}
7+
8+
[data-sonner-toast][data-styled="true"] {
9+
--normal-bg: var(--sds-clr-gray-02);
10+
background: var(--sds-clr-gray-02);
11+
border: 1px solid var(--sds-clr-gray-06);
12+
border-radius: pxToRem(8px);
13+
padding: pxToRem(12px);
14+
gap: pxToRem(8px);
15+
box-shadow: none;
16+
}
17+
18+
[data-close-button] {
19+
order: 3;
20+
margin-left: auto;
21+
}
22+
23+
[data-sonner-toast][data-styled="true"] [data-title] {
24+
font-size: pxToRem(14px);
25+
font-weight: 600;
26+
line-height: pxToRem(20px);
27+
color: var(--sds-clr-gray-12);
28+
}
29+
30+
[data-sonner-toast][data-styled="true"][data-type="success"] [data-icon] {
31+
color: var(--sds-clr-green-09, #30a46c);
32+
33+
svg {
34+
width: pxToRem(16px);
35+
height: pxToRem(16px);
36+
}
37+
}
38+
39+
[data-sonner-toast][data-styled="true"][data-type="error"] [data-icon] {
40+
color: var(--sds-clr-red-09, #e5484d);
41+
42+
svg {
43+
width: pxToRem(16px);
44+
height: pxToRem(16px);
45+
}
46+
}
47+
48+
[data-sonner-toast][data-styled="true"] [data-icon] {
49+
svg {
50+
width: pxToRem(16px);
51+
height: pxToRem(16px);
52+
}
53+
}
54+
55+
[data-sonner-toast][data-styled="true"] [data-close-button] {
56+
position: static;
57+
top: unset;
58+
right: unset;
59+
left: unset;
60+
transform: none;
61+
background: transparent;
62+
border: none;
63+
color: var(--sds-clr-gray-09);
64+
width: pxToRem(20px);
65+
height: pxToRem(20px);
66+
padding: pxToRem(2px);
67+
68+
&:hover {
69+
background: transparent;
70+
color: var(--sds-clr-gray-12);
71+
}
72+
73+
svg {
74+
width: pxToRem(16px);
75+
height: pxToRem(16px);
76+
}
77+
}
578
}

0 commit comments

Comments
 (0)