Skip to content

feat(stellar): use shared fetch policy helpers for http clients - #534

Merged
Julink-eth merged 3 commits into
mainfrom
refactor/stellar-http-clients-fetch-policy
Oct 28, 2026
Merged

Julink-eth merged 3 commits into
mainfrom
refactor/stellar-http-clients-fetch-policy

Conversation

@Julink-eth

Copy link
Copy Markdown
Contributor

Explanation

Integrates the shared fetch retry and circuit-breaker policy into the Stellar wallet Snap's HTTP API clients (PriceApiClient, TokenApiClient, and SecurityAlertsApiClient).

  • Wraps Price API, Token API, and Security Alerts API requests with per-service policies (createFetchPolicy / fetchWithPolicy) for transient retries, bounded 10s timeouts, Retry-After handling, body-read retries, and circuit breaking.
  • Preserves existing public error semantics (HttpException / HttpResponseException) via normalizeFetchPolicyException.
  • Provides the @metamask/snap-networks-utils/performance-shim in snap.config.ts for bundle runtime timing.

A follow-up PR will be created to add the shared policy for the RPC and stellar SDK usage.

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

@Julink-eth
Julink-eth requested review from a team as code owners October 28, 2026 08:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

There are no active review issues for the shared HTTP fetch-policy integration.

No open issues 🎉

What changed in this PR

Integrates shared fetch policies into the Stellar wallet Snap’s HTTP clients to improve resilience while preserving existing HTTP exception types. RPC and Stellar SDK integration remain out of scope.

Changes:

  • Adds retries, bounded timeouts, and circuit breaking for Price, Token, and Security Alerts API requests.
  • Normalizes policy errors and expands tests for retries and response-body failures.
  • Configures the runtime performance shim and updates build metadata and the changelog.
File Description
yarn.lock Records the Stellar package’s webpack dependency.
packages/​stellar-wallet-snap/​src/​utils/​errors.ts Converts policy failures into existing HTTP exceptions.
packages/​stellar-wallet-snap/​src/​utils/​errors.test.ts Tests policy-error normalization.
packages/​stellar-wallet-snap/​src/​services/​price/​price-api/​PriceApiClient.ts Applies the shared fetch policy to price requests.
packages/​stellar-wallet-snap/​src/​services/​price/​price-api/​PriceApiClient.test.ts Tests request retries and body-read recovery.
packages/​stellar-wallet-snap/​src/​services/​asset-metadata/​token-api/​TokenApiClient.ts Applies the shared fetch policy to token requests.
packages/​stellar-wallet-snap/​src/​services/​asset-metadata/​token-api/​TokenApiClient.test.ts Tests token-request retries and body-read recovery.
packages/​stellar-wallet-snap/​src/​context.ts Supplies a policy to the Security Alerts client.
packages/​stellar-wallet-snap/​snap.manifest.json Updates the bundle checksum.
packages/​stellar-wallet-snap/​snap.config.ts Provides the performance shim through webpack.
packages/​stellar-wallet-snap/​package.json Adds webpack as a development dependency.
packages/​stellar-wallet-snap/​CHANGELOG.md Documents the HTTP resilience changes.
eslint-suppressions.json Removes the suppression now handled inline in Snap configuration.

Review effort: Balanced

@stanleyyconsensys stanleyyconsensys left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

Approve with not blocking comments

}): never {
const normalized = normalizeHttpException(error);
const normalized = normalizeHttpException(
normalizeFetchPolicyException(error),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit:

shall we move normalizeFetchPolicyException inside the normalizeHttpException

Comment on lines +157 to +160
policy: createFetchPolicy({
service: 'security_alerts_api',
logger,
}),

@stanleyyconsensys stanleyyconsensys Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Question:
why we dont move it into SecurityAlertsApiClient? or we leave it to client to config?

Nit:
shall we provide a prefix for the logger (alignment)
logger.withPrefix('[🛡️ SecurityAlertsApiClient]'),

@sonarqubecloud

Copy link
Copy Markdown

@Julink-eth
Julink-eth added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 3863687 Oct 28, 2026
56 checks passed
@Julink-eth
Julink-eth deleted the refactor/stellar-http-clients-fetch-policy branch October 28, 2026 08:58
LabinatorSolutions pushed a commit to LabinatorSolutions/metamask-extension that referenced this pull request Nov 7, 2026
<!--
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**

Bumps the Solana, Stellar, and Tron wallet snaps to the versions
released in internal-snaps `22.0.0`:

- `@metamask/solana-wallet-snap`: `^7.2.0` → `^7.3.0`
- `@metamask/stellar-wallet-snap`: `^2.0.0` → `^2.1.0`
- `@metamask/tron-wallet-snap`: `^4.3.1` → `^4.4.0`

All three are backwards-compatible minor updates; no application code
changes are required.

### @metamask/solana-wallet-snap 7.3.0

- Remove the temporary fallback that injected `https://metamask.io` as
the request origin when `keyring_submitRequest` was called without one
([MetaMask#533](MetaMask/internal-snaps#533)).

### @metamask/stellar-wallet-snap 2.1.0

- `confirmSend` now throws when signing or submission fails after the
user confirms, instead of returning a JSON error response
([MetaMask#550](MetaMask/internal-snaps#550)).
- Bump `@stellar/stellar-sdk` from `^17.2.1` to `^17.4.0`
([MetaMask#545](MetaMask/internal-snaps#545)).
- Retry transient Token API, Price API, Security Alerts API, RPC, and
Horizon failures with bounded timeouts and circuit breaking
([MetaMask#534](MetaMask/internal-snaps#534),
[MetaMask#551](MetaMask/internal-snaps#551)).
- Fix `onAmountInput` to accept the optional destination as `toAddress`
instead of `to`
([MetaMask#558](MetaMask/internal-snaps#558)).

### @metamask/tron-wallet-snap 4.4.0

- Support `VoteWitnessContract` and `AccountPermissionUpdateContract`
transactions by upgrading TronWeb to 6.5.1
([MetaMask#561](MetaMask/internal-snaps#561)).
- Align transaction security warning copy and scan-loading behavior with
user preferences
([MetaMask#557](MetaMask/internal-snaps#557)).

## **Changelog**

CHANGELOG entry: null

## **Related issues**

n/a

## **Manual testing steps**

n/a

## **Screenshots/Recordings**

### **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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.
anxolin pushed a commit to anxolin/internal-snaps that referenced this pull request Nov 7, 2026
## Explanation

This release branch prepares version `22.0.0`. It contains:

- `@metamask/solana-wallet-snap` `7.2.0` → `7.3.0` (minor: remove
obsolete `https://metamask.io` origin fallback)
- `@metamask/stellar-wallet-snap` `2.0.0` → `2.1.0` (minor: fetch policy
for RPC, Horizon and HTTP clients, `@stellar/stellar-sdk` upgrade,
`onAmountInput` `toAddress` fix, `confirmSend` now throws after
confirmation failures)
- `@metamask/tron-wallet-snap` `4.3.1` → `4.4.0` (minor:
`VoteWitnessContract` and `AccountPermissionUpdateContract` support via
TronWeb 6.5.1, security warning copy and scan-loading alignment)
- Root monorepo version bumped to `22.0.0`

## References

- `@metamask/solana-wallet-snap`:
[MetaMask#533](MetaMask#533)
- `@metamask/stellar-wallet-snap`:
[MetaMask#550](MetaMask#550),
[MetaMask#545](MetaMask#545),
[MetaMask#534](MetaMask#534),
[MetaMask#551](MetaMask#551),
[MetaMask#558](MetaMask#558)
- `@metamask/tron-wallet-snap`:
[MetaMask#561](MetaMask#561),
[MetaMask#557](MetaMask#557)

## Checklist

- [x] I've communicated my changes to consumers by [updating changelogs
for packages I've
changed](https://github.com/MetaMask/internal-snaps/tree/main/docs/processes/updating-changelogs.md)
- [ ] I've introduced [breaking
changes](https://github.com/MetaMask/internal-snaps/tree/main/docs/processes/breaking-changes.md)
in this PR and have prepared draft pull requests for clients and
consumer packages to resolve them
weitingsun pushed a commit to Poovarasan-Sandhanam/metamask-mobile that referenced this pull request Nov 10, 2026
…taMask#39134)

<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.
-->

## **Description**

Bumps the Bitcoin, Solana, Stellar, and Tron wallet snaps to their
latest published versions:

- `@metamask/bitcoin-wallet-snap`: `^3.2.0` → `^3.3.0`
- `@metamask/solana-wallet-snap`: `^7.2.0` → `^7.3.0`
- `@metamask/stellar-wallet-snap`: `^2.0.0` → `^2.1.0`
- `@metamask/tron-wallet-snap`: `^4.3.0` → `^4.4.0`

All are backwards-compatible minor updates; no application code changes
are required.

### @metamask/bitcoin-wallet-snap 3.3.0

- Retry transient Bitcoin indexer, price API, and signed transaction
broadcast failures with the shared fetch policy, and treat duplicate
broadcasts as successful
([MetaMask#530](MetaMask/internal-snaps#530)).
- Fix formatting of small Bitcoin balances to avoid scientific notation
([MetaMask#543](MetaMask/internal-snaps#543)).

### @metamask/solana-wallet-snap 7.3.0

- Remove the temporary fallback that injected `https://metamask.io` as
the request origin when `keyring_submitRequest` was called without one
([MetaMask#533](MetaMask/internal-snaps#533)).

### @metamask/stellar-wallet-snap 2.1.0

- `confirmSend` now throws when signing or submission fails after the
user confirms, instead of returning a JSON error response
([MetaMask#550](MetaMask/internal-snaps#550)).
- Bump `@stellar/stellar-sdk` from `^17.2.1` to `^17.4.0`
([MetaMask#545](MetaMask/internal-snaps#545)).
- Retry transient Token API, Price API, Security Alerts API, RPC, and
Horizon failures with bounded timeouts and circuit breaking
([MetaMask#534](MetaMask/internal-snaps#534),
[MetaMask#551](MetaMask/internal-snaps#551)).
- Fix `onAmountInput` to accept the optional destination as `toAddress`
instead of `to`
([MetaMask#558](MetaMask/internal-snaps#558)).

### @metamask/tron-wallet-snap 4.4.0

- Support `VoteWitnessContract` and `AccountPermissionUpdateContract`
transactions by upgrading TronWeb to 6.5.1
([MetaMask#561](MetaMask/internal-snaps#561)).
- Align transaction security warning copy and scan-loading behavior with
user preferences
([MetaMask#557](MetaMask/internal-snaps#557)).

## **Changelog**

CHANGELOG entry: Updated the Solana, Stellar, and Tron wallet snaps to
their latest versions.

## **Related issues**

Fixes: N/A

## **Manual testing steps**

```gherkin
Feature: Bitcoin and non-EVM wallet flows

  Scenario: user views account assets
    Given the user has Bitcoin, Solana, Stellar, and Tron accounts with assets
    When user opens the wallet and switches between those networks
    Then the assets and balances load successfully

  Scenario: user sends funds on each network
    Given the user has funds on Bitcoin, Solana, Stellar, and Tron
    When user sends funds on each network
    Then the fee estimate and confirmation are displayed correctly
    And the transaction is broadcast and completes successfully
```

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

N/A

## **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.

#### Performance checks (if applicable)

- [x] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [x] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [x] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants