Skip to content

Conversation

runway-github[bot]
Copy link
Contributor

@runway-github runway-github bot commented Oct 18, 2025

Description

Fixes bugs in PerpsController causing users to be incorrectly
geo-blocked. I've also updated the ON_RAMP_GEO_BLOCKING_URLS.DEV URL
to point to UAT since it's more reliable.

Problem Context

Recently a race condition was introduced where the PerpsController’s
subscription to the RemoteFeatureFlagController:stateChange event
isn’t created until after the remote feature flag fetches flags.
This caused us to always use the fallback since we only started
listening for remote flag changes after they were already made (missing
the stateChange event).

Proposed Solution

  1. Use existing RemoteFeatureFlagController flags if available instead
    of relying purely on the subscription

  2. Listen for RemoteFeatureFlagController:stateChange events in case
    the user's network/device is slow and the remote flags aren't
    immediately available from Step Inject inpage js #1.

Changelog

CHANGELOG entry: fixed perps-controller geo block race condition with
remote feature flags

Related issues

Fixes: TAT-1888: Fix PerpsController geo block remote flag race
condition

Manual testing steps

Feature: Perps Remote Feature Flags

  Scenario: user opens application and attempts to deposit funds without being geo-blocked
    Given user navigates to the perps market list page

    When user clicks "add funds"
    Then they should be redirected to the deposit screen and not see the geo-block bottom sheet 

Pre-merge author checklist

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.

Note

Reads remote feature flags during PerpsController construction (with fallback and no downgrade), updates DEV geo URL, exposes RemoteFeatureFlagController:getState to messenger, and adds targeted tests.

  • PerpsController:
    • Read RemoteFeatureFlagController:getState during construction to initialize blockedRegionList and refresh eligibility; keep subscription; log errors; prevent fallback from overriding remote.
    • Extend AllowedActions to include RemoteFeatureFlagController:getState.
    • Update ON_RAMP_GEO_BLOCKING_URLS.DEV to UAT endpoint.
  • Messenger:
    • Allow RemoteFeatureFlagController:getState in allowedActions.
  • Tests:
    • Add cases for reading remote flags on init, applying remote vs fallback regions, avoiding downgrade, and handling errors; update mocks where needed; ensure testnet skips data lake reporting.

Written by Cursor Bugbot for commit 726d71b. This will update automatically on new commits. Configure here.

944a916

… flag race condition (#21385)

<!--
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.
-->

Fixes bugs in PerpsController causing users to be incorrectly
geo-blocked. I've also updated the `ON_RAMP_GEO_BLOCKING_URLS.DEV` URL
to point to UAT since it's more reliable.

Recently a race condition was introduced where the `PerpsController`’s
subscription to the `RemoteFeatureFlagController:stateChange` event
isn’t created until **after** the remote feature flag fetches flags.
This caused us to always use the fallback since we only started
listening for remote flag changes after they were already made (missing
the `stateChange` event).

1. Use existing `RemoteFeatureFlagController` flags if available instead
of relying purely on the subscription

2. Listen for `RemoteFeatureFlagController:stateChange` events in case
the user's network/device is slow and the remote flags aren't
immediately available from Step #1.

<!--
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?
-->

<!--
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: fixed perps-controller geo block race condition with
remote feature flags

Fixes: [TAT-1888: Fix PerpsController geo block remote flag race
condition](https://consensyssoftware.atlassian.net/browse/TAT-1888)

```gherkin
Feature: Perps Remote Feature Flags

  Scenario: user opens application and attempts to deposit funds without being geo-blocked
    Given user navigates to the perps market list page

    When user clicks "add funds"
    Then they should be redirected to the deposit screen and not see the geo-block bottom sheet
```

- [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.

- [ ] 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]
> Reads `RemoteFeatureFlagController` state during `PerpsController`
construction to apply remote geo-blocking immediately, adds allowed
action, updates DEV geolocation URL, and adds focused tests.
>
> - **PerpsController**:
> - **Race fix**: On construct, immediately call
`RemoteFeatureFlagController:getState` and apply `blockedRegions` via
`refreshEligibilityOnFeatureFlagChange`, falling back only if remote
unavailable; never downgrade from remote to fallback.
> - **Messaging**: Extend `AllowedActions` to include
`RemoteFeatureFlagControllerGetStateAction` and subscribe to
`RemoteFeatureFlagController:stateChange` as before.
> - **Config**: Update `ON_RAMP_GEO_BLOCKING_URLS.DEV` to
`https://on-ramp.uat-api.cx.metamask.io/geolocation` (with note on
reliability).
> - **Messenger**
(`app/core/Engine/messengers/perps-controller-messenger`): allow
`RemoteFeatureFlagController:getState` in `allowedActions`.
> - **Tests** (`PerpsController.test.ts`):
> - Add constructor tests for reading/applying remote flags, fallback
behavior, no-downgrade rule, and error handling with `Logger.error`.
> - Adjust mocks to return remote flags for
`RemoteFeatureFlagController:getState`.
> - Ensure testnet data lake reporting is skipped with updated messenger
mocks.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f9e5d8e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@runway-github runway-github bot requested a review from a team as a code owner October 18, 2025 01:51
Copy link
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@Matt561 Matt561 added No QA Needed Apply this label when your PR does not need any QA effort. team-perps Perps team labels Oct 18, 2025
Copy link

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

Labels

No QA Needed Apply this label when your PR does not need any QA effort. size-M team-perps Perps team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant