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

feat: support sending multi collectibles #20045

Merged
merged 9 commits into from
May 17, 2024

Conversation

BalogunofAfrica
Copy link
Contributor

@BalogunofAfrica BalogunofAfrica commented May 15, 2024

Fixes
#19143

Summary

Adds support for ERC1155 (Multi collectibles) send transaction

Adds constants for contract type as seen in status-go https://github.com/status-im/status-go/blob/develop/services/wallet/common/const.go#L31-L38

Platforms

  • Android
  • iOS
Functional
  • wallet / transactions

Steps to test

  • Open Status
  • Go to wallet tab
  • Click on account
  • Click collectible tab and select an ERC1155 type collectible to send
  • Click send and paste recipient wallet address
  • Choose the number you want the send by typing and then click continue to get suggested routes
  • Once satisfied, slide the "Slide to send" and authorize transaction
Simulator.Screen.Recording.-.iPhone.11.Pro.-.2024-05-15.at.16.05.36.mp4

status: ready


(rf/reg-event-fx
:wallet/set-collectible-to-send
(fn [{db :db} [{:keys [collectible current-screen]}]]
(let [collection-data (:collection-data collectible)
collectible-data (:collectible-data collectible)
contract-type (:contract-type collectible)
tx-type (if (= contract-type constants/contract-type-erc-1155)
:collectible-multi
Copy link
Member

Choose a reason for hiding this comment

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

I know there will be cases where we sent multiple ERC721 tokens in the same multi-transaction, for example batch send for community tokens which are ERC-721 but treated as the same token. Is :collectible-multi some defined naming in the wallet domain? If not, I would suggest to just specify the token standard in the tx-type i.e. :collectible-erc721 or :collectible-erc1155, IMO more understandable and extensible naming. WDYT?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah that makes sense.

@status-im-auto
Copy link
Member

status-im-auto commented May 15, 2024

Jenkins Builds

Click to see older builds (36)
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ af75432 #1 2024-05-15 15:28:51 ~9 min tests 📄log
✔️ af75432 #1 2024-05-15 15:28:59 ~9 min ios 📱ipa 📲
✔️ af75432 #1 2024-05-15 15:31:47 ~12 min android-e2e 🤖apk 📲
✔️ af75432 #1 2024-05-15 15:31:54 ~12 min android 🤖apk 📲
8093e96 #2 2024-05-15 16:09:23 ~4 min tests 📄log
✔️ 8093e96 #2 2024-05-15 16:13:53 ~9 min ios 📱ipa 📲
✔️ 8093e96 #2 2024-05-15 16:16:33 ~12 min android 🤖apk 📲
✔️ 8093e96 #2 2024-05-15 16:16:40 ~12 min android-e2e 🤖apk 📲
✔️ 8e2f5e6 #3 2024-05-15 16:32:23 ~7 min tests 📄log
✔️ 8e2f5e6 #3 2024-05-15 16:34:58 ~9 min ios 📱ipa 📲
✔️ 8e2f5e6 #3 2024-05-15 16:37:58 ~12 min android-e2e 🤖apk 📲
✔️ 8e2f5e6 #3 2024-05-15 16:38:02 ~12 min android 🤖apk 📲
✔️ 643ec7b #4 2024-05-16 09:19:45 ~5 min tests 📄log
✔️ 643ec7b #4 2024-05-16 09:25:20 ~11 min android-e2e 🤖apk 📲
✔️ 643ec7b #4 2024-05-16 09:25:27 ~11 min ios 📱ipa 📲
✔️ 643ec7b #4 2024-05-16 09:25:35 ~11 min android 🤖apk 📲
✔️ 15ff3e2 #5 2024-05-16 12:02:20 ~7 min tests 📄log
✔️ 15ff3e2 #5 2024-05-16 12:07:42 ~12 min android-e2e 🤖apk 📲
✔️ 15ff3e2 #5 2024-05-16 12:07:47 ~12 min android 🤖apk 📲
✔️ 15ff3e2 #5 2024-05-16 12:09:48 ~14 min ios 📱ipa 📲
✔️ b842e0f #6 2024-05-16 12:25:29 ~8 min tests 📄log
✔️ b842e0f #6 2024-05-16 12:29:17 ~12 min android 🤖apk 📲
✔️ b842e0f #6 2024-05-16 12:29:17 ~12 min android-e2e 🤖apk 📲
✔️ b842e0f #6 2024-05-16 12:29:47 ~13 min ios 📱ipa 📲
✔️ a95551c #8 2024-05-16 13:16:18 ~5 min tests 📄log
✔️ a95551c #8 2024-05-16 13:17:38 ~6 min android 🤖apk 📲
✔️ a95551c #8 2024-05-16 13:18:17 ~6 min android-e2e 🤖apk 📲
✔️ a95551c #8 2024-05-16 13:20:32 ~9 min ios 📱ipa 📲
✔️ 516b77a #9 2024-05-16 14:41:35 ~7 min tests 📄log
✔️ 516b77a #9 2024-05-16 14:44:20 ~10 min android-e2e 🤖apk 📲
✔️ 516b77a #9 2024-05-16 14:44:28 ~10 min ios 📱ipa 📲
✔️ 516b77a #9 2024-05-16 14:49:20 ~15 min android 🤖apk 📲
✔️ d3921d8 #10 2024-05-16 21:03:32 ~7 min tests 📄log
✔️ d3921d8 #10 2024-05-16 21:06:49 ~10 min ios 📱ipa 📲
✔️ d3921d8 #10 2024-05-16 21:08:59 ~12 min android-e2e 🤖apk 📲
✔️ d3921d8 #10 2024-05-16 21:09:07 ~12 min android 🤖apk 📲
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 5f1383a #12 2024-05-17 08:36:32 ~5 min tests 📄log
✔️ 5f1383a #12 2024-05-17 08:38:31 ~7 min android 🤖apk 📲
✔️ 5f1383a #12 2024-05-17 08:38:36 ~7 min android-e2e 🤖apk 📲
✔️ 5f1383a #12 2024-05-17 08:46:42 ~15 min ios 📱ipa 📲
✔️ 4dacc9e #13 2024-05-17 21:02:43 ~9 min tests 📄log
✔️ 4dacc9e #13 2024-05-17 21:03:06 ~9 min ios 📱ipa 📲
✔️ 4dacc9e #13 2024-05-17 21:07:38 ~14 min android-e2e 🤖apk 📲
✔️ 4dacc9e #13 2024-05-17 21:07:45 ~14 min android 🤖apk 📲

@BalogunofAfrica BalogunofAfrica force-pushed the feat/support-sending-multi-collectibles branch from 8093e96 to 8e2f5e6 Compare May 15, 2024 16:25
@status-im-auto
Copy link
Member

87% of end-end tests have passed

Total executed tests: 52
Failed tests: 5
Expected to fail tests: 2
Passed tests: 45
IDs of failed tests: 727230,704613,727229,702807,702775 
IDs of expected to fail tests: 703495,703503 

Failed tests (5)

Click to expand
  • Rerun failed tests

  • Class TestWalletMultipleDevice:

    1. test_wallet_send_asset_from_drawer, id: 727230

    # STEP: Getting ETH amount in the wallet of the sender before transaction
    Device 1: Find `WalletTab` by `accessibility id`: `wallet-stack-tab`

    critical/test_wallet.py:117: in test_wallet_send_asset_from_drawer
        sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
    critical/test_wallet.py:39: in _get_balances_before_tx
        self.wallet_1.wallet_tab.click()
    ../views/base_element.py:90: in click
        element = self.find_element()
    ../views/base_element.py:79: in find_element
        raise NoSuchElementException(
     Device 1: WalletTab by accessibility id: `wallet-stack-tab` 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
    



    2. test_wallet_send_eth, id: 727229

    Device 1: Swiping right on element SlideButton
    Device 1: Find SlideButton by xpath: //*[@resource-id='slide-button-track']

    critical/test_wallet.py:109: in test_wallet_send_eth
        self.wallet_1.send_asset(address=self.receiver['address'], asset_name='Ether', amount=amount_to_send)
    ../views/wallet_view.py:99: in send_asset
        self.confirm_transaction()
    ../views/wallet_view.py:86: in confirm_transaction
        self.slide_and_confirm_with_password()
    ../views/wallet_view.py:80: in slide_and_confirm_with_password
        self.slide_button_track.slide()
    ../views/base_view.py:257: in slide
        self.swipe_right_on_element(width_percentage=1.3, start_x=100)
    ../views/base_element.py:308: in swipe_right_on_element
        location, size = self.get_element_coordinates()
    ../views/base_element.py:294: in get_element_coordinates
        element = self.find_element()
    ../views/base_element.py:79: in find_element
        raise NoSuchElementException(
     Device 1: SlideButton by xpath: `//*[@resource-id='slide-button-track']` 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 TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_join_send_text_messages_push, id: 702807

    Device 2: Find Text by xpath: //*[starts-with(@text,'Hey, admin!')]/ancestor::android.view.ViewGroup[@content-desc='chat-item']//*[@content-desc='message-status']/android.widget.TextView
    Device 2: Text is Sent

    critical/chats/test_group_chat.py:95: in test_group_chat_join_send_text_messages_push
        self.chats[1].chat_element_by_text(message_to_admin).wait_for_status_to_be('Delivered', timeout=120)
    ../views/chat_view.py:225: in wait_for_status_to_be
        raise TimeoutException("Message status was not changed to %s, it's %s" % (expected_status, current_status))
     Message status was not changed to Delivered, it's Sent
    



    Device sessions

    Class TestDeepLinksOneDevice:

    1. test_links_open_universal_links_from_chat, id: 704613

    Device 1: Find Button by xpath: //*[@text="open community"]
    Device 1: Tap on found: Button

    critical/test_deep_and_universal_links.py:70: in test_links_open_universal_links_from_chat
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Community 'Open community for e2e' was not requested to join by the url https://status.app/c/G1AAAGR0G-IRb2YJD4lRXwLusAFnGrDHGNl6Wt55MIARwVYvarnO873011-fdVSz1kHSan-qq0G96vOaMqyTRhJnQV74KCUr#zQ3shb9irJR66rhG1E8sQZX8pDU3dpGm4daYSmPVDd2e73ewE
    



    Device sessions

    2. test_links_deep_links, id: 702775

    Device 1: Find BrowserTab by accessibility id: browser-stack-tab
    Device 1: Tap on found: BrowserTab

    critical/test_deep_and_universal_links.py:114: in test_links_deep_links
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Community 'Open community for e2e' was not requested to join by the deep link status.app://c/G1AAAGR0G-IRb2YJD4lRXwLusAFnGrDHGNl6Wt55MIARwVYvarnO873011-fdVSz1kHSan-qq0G96vOaMqyTRhJnQV74KCUr#zQ3shb9irJR66rhG1E8sQZX8pDU3dpGm4daYSmPVDd2e73ewE
    



    Device sessions

    Expected to fail tests (2)

    Click to expand

    Class TestCommunityOneDeviceMerged:

    1. test_community_discovery, id: 703503

    Test is not run, e2e blocker  
    

    [[reason: [NOTRUN] Curated communities not loading, https://github.com//issues/17852]]

    Class TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_mute_chat, id: 703495

    # STEP: Change device time so chat will be unmuted by timer
    Device 2: Long press on ChatElement

    critical/chats/test_group_chat.py:464: in test_group_chat_mute_chat
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Chat is still muted after timeout 
    

    [[Chat is not unmuted after expected time: https://github.com//issues/19627]]

    Device sessions

    Passed tests (45)

    Click to expand

    Class TestActivityCenterContactRequestMultipleDevicePR:

    1. test_add_contact_field_validation, id: 702777
    Device sessions

    2. test_activity_center_contact_request_accept_swipe_mark_all_as_read, id: 702851
    Device sessions

    3. test_activity_center_contact_request_decline, id: 702850
    Device sessions

    Class TestOneToOneChatMultipleSharedDevicesNewUiTwo:

    1. test_1_1_chat_delete_via_long_press_relogin, id: 702784
    Device sessions

    2. test_1_1_chat_is_shown_message_sent_delivered_from_offline, id: 702783
    Device sessions

    3. test_1_1_chat_mute_chat, id: 703496
    Device sessions

    Class TestActivityMultipleDevicePR:

    1. test_navigation_jump_to, id: 702936
    Device sessions

    2. test_activity_center_reply_read_unread_delete_filter_swipe, id: 702947
    Device sessions

    Class TestCommunityMultipleDeviceMerged:

    1. test_community_several_images_send_reply, id: 703194
    Device sessions

    2. test_community_one_image_send_reply, id: 702859
    Device sessions

    3. test_community_emoji_send_copy_paste_reply, id: 702840
    Device sessions

    4. test_community_mark_all_messages_as_read, id: 703086
    Device sessions

    5. test_community_contact_block_unblock_offline, id: 702894
    Device sessions

    6. test_community_edit_delete_message_when_offline, id: 704615
    Device sessions

    7. test_community_message_delete, id: 702839
    Device sessions

    8. test_community_message_send_check_timestamps_sender_username, id: 702838
    Device sessions

    9. test_community_links_with_previews_github_youtube_twitter_gif_send_enable, id: 702844
    Device sessions

    10. test_community_message_edit, id: 702843
    Device sessions

    11. test_community_unread_messages_badge, id: 702841
    Device sessions

    Class TestCommunityMultipleDeviceMergedTwo:

    1. test_community_markdown_support, id: 702809
    Device sessions

    2. test_community_hashtag_links_to_community_channels, id: 702948
    Device sessions

    3. test_community_mentions_push_notification, id: 702786
    Device sessions

    4. test_community_leave, id: 702845
    Device sessions

    5. test_community_join_when_node_owner_offline, id: 703629
    Device sessions

    Class TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_pin_messages, id: 702732
    Device sessions

    2. test_group_chat_send_image_save_and_share, id: 703297
    Device sessions

    3. test_group_chat_reactions, id: 703202
    Device sessions

    4. test_group_chat_offline_pn, id: 702808
    Device sessions

    Class TestCommunityOneDeviceMerged:

    1. test_restore_multiaccount_with_waku_backup_remove_switch, id: 703133
    Device sessions

    2. test_community_copy_and_paste_message_in_chat_input, id: 702742
    Device sessions

    3. test_community_undo_delete_message, id: 702869
    Device sessions

    4. test_community_navigate_to_channel_when_relaunch, id: 702846
    Device sessions

    5. test_community_mute_community_and_channel, id: 703382
    Device sessions

    Class TestActivityMultipleDevicePRTwo:

    1. test_activity_center_mentions, id: 702957
    Device sessions

    2. test_activity_center_admin_notification_accept_swipe, id: 702958
    Device sessions

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_regular_account, id: 727231
    Device sessions

    2. test_wallet_add_remove_watch_only_account, id: 727232
    Device sessions

    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_emoji_send_reply_and_open_link, id: 702782
    Device sessions

    2. test_1_1_chat_text_message_delete_push_disappear, id: 702733
    Device sessions

    3. test_1_1_chat_push_emoji, id: 702813
    Device sessions

    4. test_1_1_chat_non_latin_messages_stack_update_profile_photo, id: 702745
    Device sessions

    5. test_1_1_chat_edit_message, id: 702855
    Device sessions

    6. test_1_1_chat_send_image_save_and_share, id: 703391
    Device sessions

    7. test_1_1_chat_pin_messages, id: 702731
    Device sessions

    8. test_1_1_chat_message_reaction, id: 702730
    Device sessions

    @J-Son89
    Copy link
    Contributor

    J-Son89 commented May 15, 2024

    a question, the schema error that pops up in the video - did you address that? 🤔

    (def ^:const bridge-name-hop "Hop")

    (def ^:const contract-type-uknown 0)
    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    should we specify what type of contract? 🤔

    Copy link
    Contributor Author

    Choose a reason for hiding this comment

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

    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    I more meant, this is in a very high level file. For that reason contract could mean a plethora of things.
    Perhaps smart_contract_... is more appropriate

    Copy link
    Contributor Author

    Choose a reason for hiding this comment

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

    I think a prefix of wallet also works, just to stay similar to the go side which uses add its under the wallet namespace.

    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    Yep probably better tbh

    @@ -138,7 +138,8 @@
    {:prefix prefix
    :testnet-enabled? testnet-enabled?
    :goerli-enabled? goerli-enabled?})
    collectible-tx? (= (-> db :wallet :ui :send :tx-type) :collectible)
    collectible-tx? (contains? #{:collectible-erc-721 :collectible-erc-1155}
    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    perhaps we put this set in a constant somewhere?

    @BalogunofAfrica BalogunofAfrica force-pushed the feat/support-sending-multi-collectibles branch from 8e2f5e6 to 643ec7b Compare May 16, 2024 09:13
    @BalogunofAfrica BalogunofAfrica requested a review from J-Son89 May 16, 2024 09:16
    @VolodLytvynenko VolodLytvynenko self-assigned this May 16, 2024
    @VolodLytvynenko
    Copy link
    Contributor

    Hi @BalogunofAfrica thank you for PR. No issues from my side. PR is ready to be merged

    @J-Son89
    Copy link
    Contributor

    J-Son89 commented May 16, 2024

    Hi @BalogunofAfrica thank you for PR. No issues from my side. PR is ready to be merged

    @BalogunofAfrica - we have a due process for pr reviews.
    At the very minimum you should have at least one developer approval (ideally giving 24hrs wait time so developers at all timezones have an opportunity to review), if you can wait for 2 approvals it's even better.

    After this it makes sense to ask for QA, before is costly of resources as it increases friction on dev changes as it can likely lead to a waste of further QA resources.

    I see that this pr is small but it is important we all stick to the process we agreed to so we can keep the quality high.

    @BalogunofAfrica BalogunofAfrica force-pushed the feat/support-sending-multi-collectibles branch from 643ec7b to 15ff3e2 Compare May 16, 2024 11:54
    @BalogunofAfrica
    Copy link
    Contributor Author

    BalogunofAfrica commented May 16, 2024

    a question, the schema error that pops up in the video - did you address that? 🤔

    Addressed here b842e0f

    @BalogunofAfrica BalogunofAfrica force-pushed the feat/support-sending-multi-collectibles branch 3 times, most recently from a95551c to 516b77a Compare May 16, 2024 14:33
    @BalogunofAfrica BalogunofAfrica force-pushed the feat/support-sending-multi-collectibles branch from 516b77a to d3921d8 Compare May 16, 2024 20:56

    (defn- collectible-selected?
    [db]
    (let [collectible-stored (-> db :wallet :ui :send :collectible)
    tx-type (-> db :wallet :ui :send :tx-type)]
    (and (some? collectible-stored)
    (= tx-type :collectible))))
    (send-utils/tx-type-collectible? tx-type))))
    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    Why are you checking for collectible tx type that way.. you seem to be checking for

    (def ^:private collectible-tx-set
      #{:tx/collectible-erc-721
        :tx/collectible-erc-1155})
    

    if it contains :collectible, what is the benefit of that over (= tx-type :collectible) ?

    Copy link
    Contributor Author

    @BalogunofAfrica BalogunofAfrica May 17, 2024

    Choose a reason for hiding this comment

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

    The tx-type for collectibles used to be just :collectible before because we supported only erc-721 collectibles. But now it is either :tx/collectible-erc-721 or :tx/collectible-erc-1155. The :collectible keyword has been renamed to :tx/collectible-erc-721.

    So a simple = for :collectible would not suffice, as we have to check if the tx-type is either of the 2 supported collectible types.

    cc: @ulisesmac

    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    Totally makes sense for me now.
    Thanks @BalogunofAfrica for the explanation, btw, I think the new name for the function is better 👍

    @BalogunofAfrica BalogunofAfrica force-pushed the feat/support-sending-multi-collectibles branch 2 times, most recently from ee07565 to 5f1383a Compare May 17, 2024 08:30
    Copy link
    Member

    @briansztamfater briansztamfater left a comment

    Choose a reason for hiding this comment

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

    LGTM! Maybe wait for another approval before merging as this PR touches sensible parts of the wallet code

    @BalogunofAfrica BalogunofAfrica requested a review from OmarBasem May 17, 2024 11:44
    Copy link
    Contributor

    @ulisesmac ulisesmac left a comment

    Choose a reason for hiding this comment

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

    Thanks for your PR @BalogunofAfrica, good work! 👍

    Comment on lines +216 to +218
    (defn tx-type-collectible?
    [tx-type]
    (contains? collectible-tx-set tx-type))
    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    We don't need contains?, the set can be used itself as a function to check this, but just saying in case you didn't know, I'm not saying it must be changed :)

    @@ -455,6 +463,14 @@
    :TokenID token-id
    :ChainID to-chain-id))

    (= bridge-name constants/bridge-name-erc-1155-transfer)
    Copy link
    Contributor

    @ilmotta ilmotta May 17, 2024

    Choose a reason for hiding this comment

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

    I haven't reviewed PRs that evolved this send.events namespace, but the fact that it has zero coverage is not good. This namespace is not trivial and I'd normally reject as a reviewer. The re-frame architecture was built to help make this layer testable and it's the top-priority recommended by re-frame to test https://github.com/day8/re-frame/blob/5bd82b3d6625af1fac2b21ba0cd5bab448e44ffe/docs/Testing.md#what-to-test.

    I know it's not a tech debt from your PR and at this stage it might be too much work to attach attack this debt. But, it's never too late to play the boy scout rule Always leave your code cleaner than you found it.

    Perhaps something you guys could figure out in future changes to this events namespace.

    Copy link
    Contributor

    Choose a reason for hiding this comment

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

    Thanks @ilmotta I'll consider it for new PRs :)

    cc: @status-im/wallet-mobile-devs

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    Archived in project
    Archived in project
    Development

    Successfully merging this pull request may close these issues.

    8 participants