Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keycard signing for dapp interactions #21785

Merged
merged 13 commits into from
Jan 28, 2025
Merged

Conversation

clauxx
Copy link
Member

@clauxx clauxx commented Dec 10, 2024

fixes #21618

Summary

  1. Added support for signing dapp requests with the keycard
  2. Removed WC methods that are not supported by test dapps anymore: eth_sign, eth_signTransaction (previously could only be tested on test dapps and no prod. dapps usage)
  3. Fixed issue where dapp logo is not shown in request sometimes

Steps to test

  • Open Status
  • Log into a keycard profile
  • Connect to dapp
  • Send any request from dapp
  • Slide the authorization slider
  • Sign with the keycard
  • Dapp shows success

status: ready

@status-im-auto
Copy link
Member

status-im-auto commented Dec 10, 2024

Jenkins Builds

Click to see older builds (41)
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 0983e41 #2 2024-12-10 14:49:40 ~4 min tests 📄log
✔️ 0983e41 #3 2024-12-10 14:55:24 ~9 min android 🤖apk 📲
✔️ 0983e41 #3 2024-12-10 14:56:14 ~10 min android-e2e 🤖apk 📲
✔️ 0983e41 #2 2024-12-10 15:01:00 ~15 min ios 📱ipa 📲
4eaab72 #4 2025-01-02 14:45:18 ~3 min tests 📄log
✔️ 4eaab72 #5 2025-01-02 14:47:58 ~6 min android-e2e 🤖apk 📲
✔️ 4eaab72 #4 2025-01-02 14:48:34 ~7 min ios 📱ipa 📲
✔️ 4eaab72 #5 2025-01-02 14:49:50 ~8 min android 🤖apk 📲
✔️ a2aa35c #6 2025-01-06 11:39:59 ~4 min tests 📄log
✔️ a2aa35c #6 2025-01-06 11:42:41 ~7 min ios 📱ipa 📲
✔️ a2aa35c #7 2025-01-06 11:42:56 ~7 min android-e2e 🤖apk 📲
✔️ a2aa35c #7 2025-01-06 11:44:28 ~9 min android 🤖apk 📲
4cc6aed #7 2025-01-09 13:49:37 ~4 min tests 📄log
✔️ 4cc6aed #8 2025-01-09 13:53:30 ~8 min android-e2e 🤖apk 📲
✔️ 4cc6aed #8 2025-01-09 13:54:00 ~8 min android 🤖apk 📲
✔️ 4cc6aed #7 2025-01-09 13:54:51 ~9 min ios 📱ipa 📲
✔️ 3f22541 #8 2025-01-13 12:43:46 ~4 min tests 📄log
✔️ 3f22541 #9 2025-01-13 12:46:02 ~6 min android-e2e 🤖apk 📲
✔️ 3f22541 #9 2025-01-13 12:46:20 ~7 min android 🤖apk 📲
✔️ 3f22541 #8 2025-01-13 12:47:21 ~8 min ios 📱ipa 📲
✔️ 6be8ed4 #9 2025-01-15 10:47:59 ~5 min tests 📄log
✔️ 6be8ed4 #9 2025-01-15 10:50:55 ~8 min ios 📱ipa 📲
✔️ 6be8ed4 #10 2025-01-15 10:51:42 ~8 min android-e2e 🤖apk 📲
✔️ 6be8ed4 #10 2025-01-15 10:52:38 ~9 min android 🤖apk 📲
✔️ 3c8d497 #10 2025-01-17 10:44:49 ~4 min tests 📄log
✔️ 3c8d497 #11 2025-01-17 10:47:00 ~7 min android-e2e 🤖apk 📲
✔️ 3c8d497 #11 2025-01-17 10:48:38 ~8 min android 🤖apk 📲
✔️ 3c8d497 #10 2025-01-17 10:50:30 ~10 min ios 📱ipa 📲
✔️ eeeb781 #11 2025-01-21 13:58:50 ~5 min tests 📄log
✔️ eeeb781 #12 2025-01-21 14:00:03 ~6 min android-e2e 🤖apk 📲
✔️ eeeb781 #12 2025-01-21 14:02:14 ~8 min android 🤖apk 📲
✔️ eeeb781 #11 2025-01-21 14:03:45 ~10 min ios 📱ipa 📲
✔️ 11fa1bf #12 2025-01-27 11:25:35 ~4 min tests 📄log
✔️ 11fa1bf #13 2025-01-27 11:31:17 ~10 min android-e2e 🤖apk 📲
✔️ 11fa1bf #13 2025-01-27 11:32:59 ~11 min android 🤖apk 📲
✔️ 11fa1bf #12 2025-01-27 11:34:01 ~12 min ios 📱ipa 📲
83c2e0e #14 2025-01-27 16:12:17 ~6 min tests 📄log
✔️ 83c2e0e #15 2025-01-27 16:13:05 ~7 min android-e2e 🤖apk 📲
✔️ 83c2e0e #15 2025-01-27 16:13:20 ~7 min android 🤖apk 📲
✔️ 83c2e0e #14 2025-01-27 16:18:09 ~12 min ios 📱ipa 📲
✔️ 83c2e0e #15 2025-01-28 09:22:38 ~1 min tests 📄log
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 96f726a #16 2025-01-28 11:45:58 ~4 min tests 📄log
✔️ 96f726a #16 2025-01-28 11:48:36 ~7 min android-e2e 🤖apk 📲
✔️ 96f726a #16 2025-01-28 11:50:35 ~9 min android 🤖apk 📲
✔️ 96f726a #15 2025-01-28 11:51:16 ~10 min ios 📱ipa 📲
✔️ 595c405 #17 2025-01-28 14:09:19 ~4 min tests 📄log
✔️ 595c405 #17 2025-01-28 14:12:44 ~7 min android-e2e 🤖apk 📲
✔️ 595c405 #17 2025-01-28 14:13:11 ~8 min android 🤖apk 📲
✔️ 595c405 #16 2025-01-28 14:14:38 ~9 min ios 📱ipa 📲

@flexsurfer
Copy link
Member

this PR should wait for #21753 , because auth on keycard has little bit changed

@VolodLytvynenko VolodLytvynenko self-assigned this Dec 16, 2024
@status-im-auto
Copy link
Member

50% of end-end tests have passed

Total executed tests: 8
Failed tests: 4
Expected to fail tests: 0
Passed tests: 4
IDs of failed tests: 727230,702745,727229,702843 

Failed tests (4)

Click to expand
  • Rerun failed tests

  • Class TestWalletMultipleDevice:

    1. test_wallet_send_asset_from_drawer, id: 727230
    Test setup failed: critical/test_wallet.py:22: in prepare_devices
        self.drivers, self.loop = create_shared_drivers(2)
    base_test_case.py:310: in create_shared_drivers
        drivers = loop.run_until_complete(start_threads(test_suite_data.current_test.name,
    /usr/lib/python3.10/asyncio/base_events.py:649: in run_until_complete
        return future.result()
    __init__.py:26: in start_threads
        returns[k] = await returns[k]
    /usr/lib/python3.10/concurrent/futures/thread.py:58: in run
        result = self.fn(*self.args, **self.kwargs)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/appium/webdriver/webdriver.py:257: in __init__
        super().__init__(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:206: in __init__
        self.start_session(capabilities)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/appium/webdriver/webdriver.py:360: in start_session
        raise SessionNotCreatedException(
     A valid W3C session creation response must contain a non-empty "sessionId" entry. Got "{'value': {'error': 'unknown error', 'message': 'failed serving request POST /wd/hub/session', 'stacktrace': ''}}" instead
    



    2. test_wallet_send_eth, id: 727229

    Test setup failed: critical/test_wallet.py:22: in prepare_devices
        self.drivers, self.loop = create_shared_drivers(2)
    base_test_case.py:310: in create_shared_drivers
        drivers = loop.run_until_complete(start_threads(test_suite_data.current_test.name,
    /usr/lib/python3.10/asyncio/base_events.py:649: in run_until_complete
        return future.result()
    __init__.py:26: in start_threads
        returns[k] = await returns[k]
    /usr/lib/python3.10/concurrent/futures/thread.py:58: in run
        result = self.fn(*self.args, **self.kwargs)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/appium/webdriver/webdriver.py:257: in __init__
        super().__init__(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:206: in __init__
        self.start_session(capabilities)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/appium/webdriver/webdriver.py:360: in start_session
        raise SessionNotCreatedException(
     A valid W3C session creation response must contain a non-empty "sessionId" entry. Got "{'value': {'error': 'unknown error', 'message': 'failed serving request POST /wd/hub/session', 'stacktrace': ''}}" instead
    



    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_non_latin_messages_stack_update_profile_photo, id: 702745

    Device 1: Find SendMessageButton by accessibility id: send-message-button
    Device 1: Tap on found: SendMessageButton

    critical/chats/test_1_1_public_chats.py:286: in test_1_1_chat_non_latin_messages_stack_update_profile_photo
        self.home_2.navigate_back_to_home_view()
    ../views/base_view.py:426: in navigate_back_to_home_view
        while not self.chat_floating_screen.is_element_disappeared(1) \
    ../views/base_element.py:231: in is_element_disappeared
        return self.wait_for_invisibility_of_element(sec)
    ../views/base_element.py:154: in wait_for_invisibility_of_element
        .until(expected_conditions.invisibility_of_element_located((self.by, self.locator)))
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/support/wait.py:86: in until
        value = method(self._driver)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/support/expected_conditions.py:320: in _predicate
        return _element_if_visible(target, visibility=False)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/support/expected_conditions.py:175: in _element_if_visible
        return element if element.is_displayed() == visibility else False
     'dict' object has no attribute 'is_displayed'
    



    Device sessions

    Class TestCommunityMultipleDeviceMerged:

    1. test_community_message_edit, id: 702843

    Test setup failed: critical/chats/test_public_chat_browsing.py:307: in prepare_devices
        self.drivers, self.loop = create_shared_drivers(2)
    base_test_case.py:310: in create_shared_drivers
        drivers = loop.run_until_complete(start_threads(test_suite_data.current_test.name,
    /usr/lib/python3.10/asyncio/base_events.py:649: in run_until_complete
        return future.result()
    __init__.py:26: in start_threads
        returns[k] = await returns[k]
    /usr/lib/python3.10/concurrent/futures/thread.py:58: in run
        result = self.fn(*self.args, **self.kwargs)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/appium/webdriver/webdriver.py:257: in __init__
        super().__init__(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:206: in __init__
        self.start_session(capabilities)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/appium/webdriver/webdriver.py:360: in start_session
        raise SessionNotCreatedException(
     A valid W3C session creation response must contain a non-empty "sessionId" entry. Got "{'value': {'error': 'unknown error', 'message': 'failed serving request POST /wd/hub/session', 'stacktrace': ''}}" instead
    



    Passed tests (4)

    Click to expand

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_regular_account, id: 727231
    2. test_wallet_balance_mainnet, id: 740490

    Class TestCommunityOneDeviceMerged:

    1. test_community_copy_and_paste_message_in_chat_input, id: 702742
    Device sessions

    2. test_restore_multiaccount_with_waku_backup_remove_profile_switch, id: 703133
    Device sessions

    @VolodLytvynenko VolodLytvynenko removed their assignment Dec 17, 2024
    @clauxx clauxx force-pushed the cl-21618-dapps-keycard-signing branch from 0983e41 to c5e6a89 Compare January 2, 2025 14:40
    @clauxx clauxx requested a review from jakubgs as a code owner January 2, 2025 14:40
    @clauxx clauxx requested a review from flexsurfer January 2, 2025 14:41
    @jakubgs jakubgs removed their request for review January 3, 2025 15:18
    @clauxx clauxx force-pushed the cl-21618-dapps-keycard-signing branch 2 times, most recently from 7b40486 to a2aa35c Compare January 6, 2025 11:35
    @shivekkhurana shivekkhurana added the wallet-core Issues for mobile wallet team label Jan 7, 2025
    @flexsurfer flexsurfer mentioned this pull request Jan 8, 2025
    11 tasks
    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 13, 2025

    @flexsurfer please have a look again so I can move it to testing

    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 13, 2025

    @status-im/mobile-qa this PR is ready for testing. LMK if smth is missing in the description.

    @status-im-auto
    Copy link
    Member

    62% of end-end tests have passed

    Total executed tests: 8
    Failed tests: 3
    Expected to fail tests: 0
    Passed tests: 5
    
    IDs of failed tests: 740490,703133,702843 
    

    Failed tests (3)

    Click to expand
  • Rerun failed tests

  • Class TestCommunityMultipleDeviceMerged:

    1. test_community_message_edit, id: 702843

    Device 2: Tap on found: Button
    Device 2: Attempt 0 is successful clicking close-activity-center

    Test setup failed: critical/chats/test_public_chat_browsing.py:318: in prepare_devices
        self.home_2.handle_contact_request(self.username_1)
    ../views/home_view.py:388: in handle_contact_request
        chat_element.accept_contact_request()
    ../views/home_view.py:167: in accept_contact_request
        self.handle_cr("accept-contact-request")
    ../views/home_view.py:164: in handle_cr
        ).wait_for_rendering_ended_and_click()
    ../views/base_element.py:154: in wait_for_rendering_ended_and_click
        self.wait_for_visibility_of_element(20)
    ../views/base_element.py:138: in wait_for_visibility_of_element
        raise TimeoutException(
     Device 2: Button by xpath:`//*[contains(@text, 'shRpyeHZw847jhX3uTfT')]/ancestor::*[@content-desc='activity']/*[@content-desc="accept-contact-request"]` is not found on the screen after wait_for_visibility_of_element
    



    Device sessions

    Class TestWalletOneDevice:

    1. test_wallet_balance_mainnet, id: 740490

    Device 1: Find AssetElement by xpath: //android.view.ViewGroup[@content-desc='container']/android.widget.TextView[@text='USDCoin']
    Device 1: Find AssetElement by xpath: //android.view.ViewGroup[@content-desc='container']/android.widget.TextView[@text='USDCoin']

    critical/test_wallet.py:236: in test_wallet_balance_mainnet
        real_balance[asset] = self.wallet_view.get_asset(asset).get_amount()
    ../views/wallet_view.py:126: in get_asset
        element.scroll_to_element(down_start_y=0.89, down_end_y=0.8)
    ../views/base_element.py:196: in scroll_to_element
        raise NoSuchElementException(
     Device 1: AssetElement by xpath: `//android.view.ViewGroup[@content-desc='container']/android.widget.TextView[@text='USDCoin']` is not found on the screen; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
    



    Class TestCommunityOneDeviceMerged:

    1. test_restore_multiaccount_with_waku_backup_remove_profile_switch, id: 703133

    Device 1: Tap on found: Button
    # STEP: Check that removed user is not shown in the list anymore

    critical/chats/test_public_chat_browsing.py:241: in test_restore_multiaccount_with_waku_backup_remove_profile_switch
        self.errors.verify_no_errors()
    base_test_case.py:176: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     zQ3...dWXh5 was not restored as a contact from waku backup!
    E    zQ3...Vacac was not restored as a contact from waku backup!
    E    admin_open was not restored from waku-backup!!
    E    member_open was not restored from waku-backup!!
    E    admin_closed was not restored from waku-backup!!
    E    member_closed was not restored from waku-backup!!
    



    Device sessions

    Passed tests (5)

    Click to expand

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_regular_account, id: 727231

    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_non_latin_messages_stack_update_profile_photo, id: 702745
    Device sessions

    Class TestCommunityOneDeviceMerged:

    1. test_community_copy_and_paste_message_in_chat_input, id: 702742
    Device sessions

    Class TestWalletMultipleDevice:

    1. test_wallet_send_asset_from_drawer, id: 727230
    2. test_wallet_send_eth, id: 727229

    @status-im-auto
    Copy link
    Member

    88% of end-end tests have passed

    Total executed tests: 8
    Failed tests: 1
    Expected to fail tests: 0
    Passed tests: 7
    
    IDs of failed tests: 702843 
    

    Failed tests (1)

    Click to expand
  • Rerun failed tests

  • Class TestCommunityMultipleDeviceMerged:

    1. test_community_message_edit, id: 702843

    Device 2: Tap on found: Button
    Device 2: Attempt 0 is successful clicking close-activity-center

    Test setup failed: critical/chats/test_public_chat_browsing.py:318: in prepare_devices
        self.home_2.handle_contact_request(self.username_1)
    ../views/home_view.py:388: in handle_contact_request
        chat_element.accept_contact_request()
    ../views/home_view.py:167: in accept_contact_request
        self.handle_cr("accept-contact-request")
    ../views/home_view.py:164: in handle_cr
        ).wait_for_rendering_ended_and_click()
    ../views/base_element.py:154: in wait_for_rendering_ended_and_click
        self.wait_for_visibility_of_element(20)
    ../views/base_element.py:138: in wait_for_visibility_of_element
        raise TimeoutException(
     Device 2: Button by xpath:`//*[contains(@text, 'shr6bEiu7JCPA7oPyqwo')]/ancestor::*[@content-desc='activity']/*[@content-desc="accept-contact-request"]` is not found on the screen after wait_for_visibility_of_element
    



    Device sessions

    Passed tests (7)

    Click to expand

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_regular_account, id: 727231
    2. test_wallet_balance_mainnet, id: 740490

    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_non_latin_messages_stack_update_profile_photo, id: 702745
    Device sessions

    Class TestCommunityOneDeviceMerged:

    1. test_community_copy_and_paste_message_in_chat_input, id: 702742
    Device sessions

    2. test_restore_multiaccount_with_waku_backup_remove_profile_switch, id: 703133
    Device sessions

    Class TestWalletMultipleDevice:

    1. test_wallet_send_asset_from_drawer, id: 727230
    2. test_wallet_send_eth, id: 727229

    @Horupa-Olena Horupa-Olena self-assigned this Jan 14, 2025
    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 27, 2025

    @pavloburykh pushed a fix for the issue you found. Thanks for noticing it 🙏

    @clauxx thank you for fixing, will check tomorrow. Could you expand a little bit on what was the root cause? Is this something related to specific account/migration/signing by non default wallet? Just wondering why Olena didn't reproduce it during last check.

    So your issue and Olena's issue seem to be different. Yours was in how we detect whether we should use the keycard to sign based on the wallet address. In Olena's case, it seems to be a provider/proxy issue, so not sure why it works now tbh

    @pavloburykh
    Copy link
    Contributor

    pavloburykh commented Jan 27, 2025

    So your issue and Olena's issue seem to be different. Yours was in how we detect whether we should use the keycard to sign based on the wallet address. In Olena's case, it seems to be a provider/proxy issue, so not sure why it works now tbh

    Yeah, I understand that issues are different. Just little bit confused why I have faced the issue and Olena didn't face the same issue. Cause we've basically been checking the same swap flow. Do I understand correctly that I have faced it cause I was connected to dapp by additional (non default) account?

    @Horupa-Olena
    Copy link

    @pavloburykh pushed a fix for the issue you found. Thanks for noticing it 🙏

    @Horupa-Olena so the first issue you found is no longer reproducible? I guess it was some issue with the proxy, maybe location related idk 🤷‍♂️

    @clauxx Yes, my first issue not reproduce now. But my location hasn’t changed during the testing, so is there a chance that this issue might occur again for me or for other users?

    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 28, 2025

    Do I understand correctly that I have faced it cause I was connected to dapp by additional (non default) account?

    @pavloburykh Yes, it's related to the non-default account. I had a bug in how it's decided whether a derived account is supposed to use the keycard when signing, so it behaved as it did - prompted to scan the keycard (cause it's a keycard profile) but attempted to sign with the keycard password. Hence the error, since the keypair for the account is not stored on device.

    @Horupa-Olena Not sure, but I don't think it's an issue specific to the keycard, since it would've still been broken otherwise.

    Copy link
    Member

    @flexsurfer flexsurfer left a comment

    Choose a reason for hiding this comment

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

    review again after all changes

    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 28, 2025

    review again after all changes

    fyi this is the only commit (except develop merges) that was added after you reviewed

    @clauxx clauxx force-pushed the cl-21618-dapps-keycard-signing branch from 83c2e0e to 96f726a Compare January 28, 2025 11:40
    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 28, 2025

    @Horupa-Olena @pavloburykh can this be merged when CI is done?

    @pavloburykh
    Copy link
    Contributor

    @Horupa-Olena @pavloburykh can this be merged when CI is done?

    @clauxx let me perform manual smoke check first. I will let you know once it is ready for merge. Thank you.

    @pavloburykh
    Copy link
    Contributor

    @clauxx please, take a look at the issue below

    ISSUE 3 Restored Profile Retains Previous Dapp Connections & Incorrectly Requires Keycard for Signing

    Steps:

    1. Restore/create profile
    2. Migrate profile to Keycard
    3. Connect wallet to any dapp
    4. Remove profile from device
    5. Restore same profile via seedphrase (do not migrate it to keycard)
    6. Open wallet and see if there any dapps connected previously
    7. Connect to any dapp and trigger event - see if app asks to sign it by password or keycard

    Actual result:

    1. Previously connected dapp is in the list although this profile has been restored from scratch
    2. Cannot remove this dapp from the list (getting error when trying to dicsonnect, although app is fact gets disconnected)
    3. Dapp events require signing via key card although profile is not migrated to keycard so it should be signed by password.

    Status-debug-logs - 2025-01-28T151648.979.zip

    Link to video

    @clauxx
    Copy link
    Member Author

    clauxx commented Jan 28, 2025

    @pavloburykh thanks for catching this one. Fixed in the last commit the issue with the signing.

    Regarding the dapps still showing up, I doubt it was caused by this PR or is related to the keycard. I think would be best to have it as a separate issue.

    @pavloburykh
    Copy link
    Contributor

    @clauxx thank you for the fixes. PR is tested and ready for merge.

    What has been tested

    Platforms: IOS/Android
    
    Flows Tested:
    
    - Connection/Disconnection to dApps
    - Tested with both test dApps and real dApps (Uniswap, 1inch, OpenSea).
    - Verified all available requests, as well as send and swap flows on real dApps.
    - Send and swap flows were tested on different account types: main, additional, and imported accounts.
    - Checked dApp connection/display for different networks, including attempts to connect to the mainnet while on a testnet and vice versa.
    - Ensured the standard connection flow to dApps functions as expected, with no regressions.
    - 
    User Scenarios:
    
    - A newly created user on Keycard.
    - A migrated user on Keycard.
    
    

    Regarding the dapps still showing up, I doubt it was caused by this PR or is related to the keycard. I think would be best to have it as a separate issue.

    @clauxx logged a separate issue #21994

    @clauxx clauxx merged commit 8ac9cc0 into develop Jan 28, 2025
    5 checks passed
    @clauxx clauxx deleted the cl-21618-dapps-keycard-signing branch January 28, 2025 15:33
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    Status: DONE
    Development

    Successfully merging this pull request may close these issues.

    🖇️ Integrate Keycard signing flow for dapp transactions
    9 participants