Skip to content

[pull] main from MetaMask:main#631

Merged
pull[bot] merged 5 commits intoReality2byte:mainfrom
MetaMask:main
Mar 26, 2026
Merged

[pull] main from MetaMask:main#631
pull[bot] merged 5 commits intoReality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 26, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

joaosantos15 and others added 5 commits March 26, 2026 08:50
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Adds `asset_symbol` property to the following tracking events:
```
Market Insights Clicked
Market Insights Viewed
Market Insights Interaction
```

Adds `Market Insights Card Scrolled to View` event.

This is necessary to make it easier to identify the assets in Mixpanel. 

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Mostly analytics/tracing changes, but it alters `useMarketInsights`
state reset behavior and gates `MARKET_INSIGHTS_VIEWED` emission on
`reportAssetId`, which could affect when the Market Insights screen
renders/tracks during fast asset switches.
> 
> **Overview**
> Adds richer Market Insights analytics by attaching `asset_symbol` and
API `digest_id` to `MARKET_INSIGHTS_OPENED`, `MARKET_INSIGHTS_VIEWED`,
and `MARKET_INSIGHTS_INTERACTION` across token and perps entry points.
> 
> Introduces a new `MARKET_INSIGHTS_CARD_SCROLLED_TO_VIEW` event fired
when the entry card becomes visible, and enhances `useViewportTracking`
with `measureInWindow`-based polling plus a new Sentry trace
(`MarketInsightsViewportTracking`) that records `measure_calls` and
whether it resolved via visibility vs unmount.
> 
> Updates `useMarketInsights` to expose `reportAssetId` and to clear
`report`/`reportAssetId` on (re)fetch; `MarketInsightsView` now avoids
sending VIEWED analytics for stale reports when `assetIdentifier`
changes before fresh data arrives. Also bumps `@metamask/ai-controllers`
to `^0.6.0` and updates tests accordingly.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8bd8607. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Antonio Regadas <antonio.regadas@consensys.net>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR hides a date field on campaign cards and makes a disclaimer
smaller and more brief within the Rewards tab. It also adds metrics for
mUSD buttons in the mUSD view.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: n/a

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<img width="1170" height="2532" alt="Simulator Screenshot - iPhone 16e -
2026-03-25 at 18 05 28"
src="https://github.com/user-attachments/assets/54ecb669-e5c2-4c5d-a809-43d14906f390"
/>

<img width="1170" height="2532" alt="Simulator Screenshot - iPhone 16e -
2026-03-25 at 18 05 24"
src="https://github.com/user-attachments/assets/36b7c1ff-8982-4da5-9863-8a71aed2ee49"
/>

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk UI/UX adjustments plus new analytics events for mUSD actions;
main risk is minor layout/regression around campaign tiles and metrics
event wiring.
> 
> **Overview**
> **Rewards campaign tiles:** Removes the top "date" row content from
`CampaignTile` (keeps the `campaign-tile-date-label` container as an
empty placeholder) and updates the tile test to no longer assert
specific date text.
> 
> **mUSD calculator tab:** Shortens and visually de-emphasizes the
disclaimer (new `rewards.musd.disclaimer_brief` string, smaller text
variant) and adds MetaMetrics tracking for the Buy and Swap buttons
using `REWARDS_PAGE_BUTTON_CLICKED` with `button_type` values
`buy_musd`/`swap_to_musd` (new `RewardsMetricsButtons` enum entries),
with tests updated accordingly.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
127a21b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

> Updates several onboarding test page objects to use the unified
cross-runner abstraction (`encapsulated` elements +
`UnifiedGestures`/`encapsulatedAction`) instead of Detox-only
`Gestures`.
> 
> Adds Appium/Playwright locator support (including iOS XPath fallbacks)
and new helper methods for visibility checks and alternate
onboarding/non-onboarding flows (notably SRP entry and continue button
behavior in `ImportWalletView`, plus `CreatePasswordView` field
handling).
> 
> Extends `WalletView` with unified elements and actions to long-press
and edit the account name label.
> 

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Moderate risk because it changes selector strategies and interaction
flows across multiple onboarding E2E page objects, which could introduce
cross-platform/Appium locator flakiness or regress existing Detox tests.
> 
> **Overview**
> Updates several onboarding test page objects to use the unified
cross-runner abstraction (`encapsulated` elements +
`UnifiedGestures`/`encapsulatedAction`) instead of Detox-only
`Gestures`.
> 
> Adds Appium/Playwright locator support (including iOS XPath fallbacks)
and new helper methods for visibility checks and alternate
onboarding/non-onboarding flows (notably SRP entry and continue button
behavior in `ImportWalletView`, plus `CreatePasswordView` field
handling).
> 
> Extends `WalletView` with unified elements and actions to long-press
and edit the account name label.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
66ef544. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…feedback buttons (#27849)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

The Market Insights thumbs up/down feedback buttons previously didn't
give a clear indication that they were selected, meaning the icons
always appeared as outlines. To improve this we added the filled state
and persist it until a new digest comes or the app is killed.

- Swaps the outline icon for the filled variant after the user gives
feedback, to highlight the selected button
- For thumbs down, the filled state is only applied after the user
submits their reason (not when the sheet opens)
- Both buttons remain tappable, since the user can switch their vote,
which fires a new analytics event and updates the filled state
- Feedback state is stored in a simple but persisted Map keyed by
report.generatedAt, so that it survives navigating out of the view
(component unmount/remount) but resets when a new digest arrives (new
generatedAt)... or the app restarts.

<img height="750" alt="Simulator Screenshot - iPhone 17 Pro - 2026-03-24
at 10 17 33"
src="https://github.com/user-attachments/assets/13341fa5-4e1e-45ed-aaf5-aa1e206259e1"
/>

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk UI-state change: adds local in-memory caching of feedback
selection keyed by `report.generatedAt` and updates icon rendering; no
sensitive data or auth flows touched.
> 
> **Overview**
> Market Insights feedback buttons now show a *filled* thumbs up/down
icon after the user submits feedback, and that selection is persisted
across `MarketInsightsView` unmount/remount for the same digest via an
in-module `Map` keyed by `report.generatedAt`.
> 
> The view resets the filled state when a new digest arrives, and tests
were expanded to cover filled-state rendering, switching votes,
dismissing the thumbs-down sheet without submitting, and
persistence/reset behavior. Separately, the `repo-skill-authoring` doc
fixes markdown code-fence formatting in the minimal examples.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
51641f1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Refactors the Card **Spending limit** screen and related asset selection
so default token choice and list ordering follow **wallet fiat value**
for the **currently selected MetaMask account**, replaces the
**multi–quick-select asset row** with a **settings-style summary card**,
and moves **full vs. restricted limit + amount** into a dedicated bottom
sheet.

**Why**: Quick-select assumed fixed symbols (e.g. mUSD-first) and did
not consistently reflect **real balances** or **account switches**.
Asset lists should align with how much the user actually holds per
account, and the main screen should read like compact “settings” rows
instead of several tappable asset tiles.

**What changed**:

- **`constants.ts`**: Adds **`CARD_CHAIN_IDS`** (Linea, Base, Monad hex
`0x8f`, Solana) using `@metamask/transaction-controller` chain IDs where
applicable; keeps **`caipChainIdToNetwork`** derived from
**`cardNetworkInfos`**.
- **`useSpendingLimit`**:
- Removes **`quickSelectTokens`**, **`handleQuickSelectToken`**, and
**`isOtherSelected`**.
- Uses **`useTokensWithBalance({ chainIds: CARD_CHAIN_IDS })`** so
default token candidates are sorted by **`tokenFiatAmount`** (highest
first); if none have positive fiat, falls back to **Linea mUSD** when
present. Candidates come from **NotEnabled** allowances when applicable,
otherwise **`buildTokenListFromSettings`** +
**`sdk.getSupportedTokensByChainId`**.
- Resets initialization when the **selected internal account** changes
(`setHasInitialized(false)`, clear selection) so defaults are not stale
across account switches.
- **`handleAccountSelect`** opens the account selector;
**`handleOtherSelect`** opens **`AssetSelectionBottomSheet`** with
**`excludedTokens`** set to the current row token;
**`handleLimitSelect`** opens the new spending-limit options sheet.
- Consumes **`returnedLimitType` / `returnedCustomLimit`** from the
options sheet via **`useFocusEffect`** (same pattern as token return
params).
- **`SpendingLimit.tsx`**: **Setup** header copy (`setup_title` /
`setup_description`); **settings card** with three rows — **Account**,
**Token** (label **`SYMBOL on NETWORK`**) with chevron → asset picker,
**Spending limit** row → options sheet; footer **Cancel** / **Confirm**.
- **`SpendingLimitOptionsSheet.tsx`** (new modal route): **Full access**
vs **Spending limit** (with numeric input), **`LimitOptionItem`**
styling tweaks (input alignment, **`maxLength={12}`**), confirm
navigates back with limit params.
- **`Routes` / Card stack**: Registers
**`CARD.MODALS.SPENDING_LIMIT_OPTIONS`** for the options sheet.
- **`AssetSelectionBottomSheet`**: Optional **`excludedTokens`** in
navigation params to hide the token already shown on the spending-limit
**Token** row; **`NotEnabled`** tokens are **sorted by fiat** using
**`rawFiatNumber`** on enriched rows.
- **`useAssetBalances`**: Uses **`CARD_CHAIN_IDS`** for
**`useTokensWithBalance`** (adds Monad, aligns with card networks);
exposes **`rawFiatNumber`** on **`AssetBalanceInfo`** for sorting.
- **`AssetCard`**: **`caipChainId`** support and optional **`onPress`**
— token icon and network badge use the token’s real chain, not
Linea-only.
- **`locales/languages/en.json`**: New/updated
**`card.card_spending_limit`** strings (`setup_title`,
`setup_description`, `account_label`, `token_label`, copy tweaks;
**Restricted** label renamed to **Spending limit** where used).
- **Tests**: **`useSpendingLimit.test.ts`**,
**`SpendingLimit.test.tsx`**, **`AssetSelectionBottomSheet.test.tsx`**
updated for new hooks, navigation params, and UI structure.

## **Changelog**

CHANGELOG entry: Card spending limit screen uses account-scoped wallet
fiat to pick and order default tokens; main view is a settings card
(account, token, limit) with asset sheet exclusions and fiat sort for
NotEnabled tokens; full vs restricted limit is configured in a dedicated
bottom sheet.

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Card spending limit and asset list reflect wallet value

  Scenario: Default token on spending limit after open
    Given I have multiple Card-supported tokens with different fiat balances on the selected account
    When I open Spending Limit (manage / enable / onboarding as applicable)
    Then the pre-selected token favors the highest fiat balance, or Linea mUSD when no positive fiat

  Scenario: Switch account
    Given I change the active MetaMask account from the Account row
    When I return to or remain on Spending Limit
    Then default token selection reflects the new account’s balances (not a stale selection)

  Scenario: Token row → asset sheet
    When I tap the Token row and pick another asset
    Then the row updates and the previously selected token is not duplicated in the list when excluded

  Scenario: Spending limit row → options sheet
    When I tap the Spending limit row
    Then I can choose full access or enter a restricted amount, confirm, and see the summary row update

  Scenario: Asset selection list ordering
    Given tokens in NotEnabled state appear in the asset sheet
    When I view the list
    Then NotEnabled tokens are ordered by fiat value where implemented
```

## **Screenshots/Recordings**


https://github.com/user-attachments/assets/02b31677-cbeb-4cb0-ba68-d507438fbc58

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Refactors card spending-limit UX and selection logic, adding new modal
navigation and changing default token selection/sorting based on wallet
fiat balances; regressions could affect which token/limit a user
configures or sees by default, especially across account switches.
> 
> **Overview**
> Refactors the Card **Spending Limit** flow into a settings-style
screen with `Account`, `Token`, and `Spending limit` rows, replacing the
prior quick-select token tiles and in-place limit options.
> 
> Adds a new `SpendingLimitOptionsSheet` modal to configure *full vs
restricted* limits (with sanitized/max-length input) and returns values
via route params; `useSpendingLimit` now drives navigation to the
account selector, token picker (excluding the currently selected token),
and the new limit sheet, and resets selection when the active internal
account changes.
> 
> Updates `AssetSelectionBottomSheet` to support `excludedTokens` and to
sort `NotEnabled` tokens by wallet fiat value (via `rawFiatNumber` from
`useAssetBalances`), standardizes supported card chain IDs via
`CARD_CHAIN_IDS`, and refreshes related strings/tests.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
68e7178. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators Mar 26, 2026
@pull pull Bot added the ⤵️ pull label Mar 26, 2026
@pull pull Bot merged commit de36dee into Reality2byte:main Mar 26, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants