Skip to content

Comments

Release: v2.14.0#772

Merged
kvhnuke merged 51 commits intomainfrom
develop
Nov 27, 2025
Merged

Release: v2.14.0#772
kvhnuke merged 51 commits intomainfrom
develop

Conversation

@kvhnuke
Copy link
Contributor

@kvhnuke kvhnuke commented Nov 27, 2025

Summary by CodeRabbit

Release Notes

  • New Features

    • Added support for Nibiru and Nibiru Testnet networks
    • Integrated geo-restriction and wallet screening checks
    • Added swap provider information display
    • Enhanced activity tracking with Routescan support
    • Added recovery phrase access in restricted views
  • Bug Fixes

    • Improved error handling for restricted access scenarios
    • Fixed transaction verification address fallback logic
  • Network Updates

    • Removed support for Canto, ZChains, OKC, XLayer, and Proof of Play Apex networks
    • Updated RPC endpoints for Astar, Fantom, Palm, Kadena, and Story networks
  • Chores

    • Updated development and runtime dependencies

✏️ Tip: You can customize this high-level summary in your review settings.

ruslan-sh-r and others added 30 commits September 8, 2025 15:30
Enable `RBTC` swaps using `Changelly` floating point API
kvhnuke and others added 20 commits November 20, 2025 10:12
- Enhanced formatting and indentation in `eth-verify-transaction.vue` for better code clarity.
- Streamlined the structure of `App.vue` by reducing unnecessary divs and improving component usage.
- Updated `lock-screen/index.vue` to improve layout and readability.
- Refined `restricted/index.vue` to enhance the user experience with clearer conditional rendering.
- Improved `swap/index.vue` by organizing component props and events for better readability.
- Enhanced `best-offer-list-item.vue` and `index.vue` for better structure and clarity.
- Added geo-restriction checks in `onboard/App.vue` to improve user flow.
- Standardized code style in `base58.ts`, `cross-browser.ts`, and various interface files for consistency.
- Ensured all interface methods end with a semicolon for uniformity.
@github-actions
Copy link

github-actions bot commented Nov 27, 2025

💼 Build Files
chrome: enkrypt-chrome-ad6990df.zip
firefox: enkrypt-firefox-ad6990df.zip

💉 Virus total analysis
chrome: ad6990df
firefox: ad6990df

@coderabbitai
Copy link

coderabbitai bot commented Nov 27, 2025

Walkthrough

This PR adds Nibiru and Nibiru Testnet network support with a new Routescan activity provider, introduces geo-restriction and wallet-restriction screening utilities, updates the extension UI with a restricted access view for blocked users, adds provider information display to the swap UI, removes support for Canto, ZChains, ProofOfPlayApex networks, updates multiple network configurations and endpoints, and bumps numerous dependency versions across packages.

Changes

Cohort / File(s) Summary
Nibiru Network Support
packages/types/src/networks.ts, packages/extension/src/providers/ethereum/networks/nibiru.ts, packages/extension/src/providers/ethereum/networks/nibiru-testnet.ts, packages/extension/src/providers/ethereum/networks/index.ts, packages/extension/src/providers/common/libs/new-features.ts
Added Nibiru and NibiruTestnet to NetworkNames enum and CoingeckoPlatform; created new EVM network modules for Nibiru mainnet and testnet with Routescan activity handler; exported new network instances and updated newNetworks to include Nibiru.
Routescan Activity Provider
packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/types.ts, packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/configs.ts, packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/index.ts, packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts
Added new Routescan provider module for fetching EVM transaction activity; includes type definitions for Routescan transactions, configuration mapping networks to Routescan endpoints, and activity fetching logic with transaction decoding.
Geo & Wallet Restriction Screening
packages/extension/src/libs/utils/screening.ts, packages/extension/src/libs/background/index.ts, packages/extension/src/ui/onboard/App.vue
Added isGeoRestricted() and isWalletRestricted() utility functions fetching from MEW API; integrated geo-restriction checks in background service and onboard view to block access when restricted.
Restricted Access UI
packages/extension/src/ui/action/App.vue, packages/extension/src/ui/action/views/restricted/index.vue, packages/extension/src/ui/action/views/settings/components/settings-inner-header.vue, packages/extension/src/ui/action/views/settings/views/settings-recovery/index.vue
Added restricted view component for geo-blocked users; integrated restriction checks into main app flow with conditional rendering; added hasBack prop to settings components for optional back button display.
Network Removals
packages/types/src/networks.ts, packages/extension/src/providers/ethereum/networks/canto.ts, packages/extension/src/providers/ethereum/networks/pop-apex.ts, packages/extension/src/providers/ethereum/networks/zcd.ts, packages/extension/src/providers/kadena/networks/index.ts
Removed Canto, ZChains, and ProofOfPlayApex networks from type enums and Kadena testnet from exported networks; deleted associated network configuration modules.
Network Configuration Updates
packages/extension/src/providers/ethereum/networks/astr.ts, packages/extension/src/providers/ethereum/networks/ftm.ts, packages/extension/src/providers/ethereum/networks/okc.ts, packages/extension/src/providers/ethereum/networks/palm.ts, packages/extension/src/providers/ethereum/networks/story.ts, packages/extension/src/providers/ethereum/networks/xlayer.ts, packages/extension/src/providers/kadena/networks/kadena.ts
Updated node endpoints and RPC URLs for various networks; removed asset handlers from OKC and XLayer; changed Story chainID; updated Kadena to use community endpoints.
Asset Handler & List Removals
packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts, packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts, packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts, packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts, packages/hw-wallets/src/ledger/ethereum/configs.ts
Removed network mappings for Canto, ZChains, OKC, XLayer, ProofOfPlayApex, Klaytn, and Syscoin from asset info handlers, token lists, and ledger supported paths.
Swap Provider UI & Types
packages/swap/src/types/index.ts, packages/swap/src/configs.ts, packages/swap/src/index.ts, packages/swap/src/common/icons/index.d.ts, packages/extension/src/ui/action/views/swap/...
Added ProviderNameProper enum for human-readable provider names; created PROVIDER_INFO mapping providers to names and icons; updated swap best-offer UI components to display provider information with icons throughout the component tree.
Swap Provider Logic
packages/swap/src/providers/changelly/index.ts, packages/swap/src/providers/okx/index.ts
Extended Changelly provider to support floating-rate swaps via RBTC detection with dynamic method selection; added guard in OKX token fetching to return empty array when data is missing.
Ethereum Provider Changes
packages/extension/src/providers/ethereum/methods/eth_accounts.ts, packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue, packages/extension/src/libs/backup-state/index.ts
Modified eth_accounts to invoke onboarding without immediate response when KeyRing uninitialized; added fallback default for recipient address in transaction verification; added excludedSignerTypes hook for account restoration filtering.
Utility Reorganization
packages/extension/src/libs/utils/initialize-wallet.ts
Reordered Kadena import alongside surrounding network imports; no functional changes.
Dependency Version Updates
README.md, package.json, packages/*/package.json
Updated devDependencies and dependencies across all packages to newer patch/minor versions; updated Polkadot packages, Vue ecosystem, Vite tooling, TypeScript/ESLint stack, Ledger/Trezor libraries, and swap SDKs; added Nibiru and Nibiru Testnet to README supported chains.
Formatting & Style Changes
packages/signers/massa/src/**/*.ts, packages/extension/src/ui/action/views/lock-screen/*.vue, packages/extension/src/ui/action/views/swap/index.vue
Minor formatting changes including semicolon additions to interface methods, import quote normalization, and padding adjustments in CSS.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant OnboardApp
    participant ScreeningUtil
    participant MEWApi as MEW API
    participant Extension

    User->>OnboardApp: Mount/Initialize
    OnboardApp->>ScreeningUtil: isGeoRestricted()
    ScreeningUtil->>MEWApi: GET /ipcomply
    MEWApi-->>ScreeningUtil: {isRestricted: true/false}
    ScreeningUtil-->>OnboardApp: true/false
    
    alt Geo Restricted
        OnboardApp->>Extension: window.open(help article)
        OnboardApp->>Extension: window.close()
    else Not Restricted
        OnboardApp->>Extension: Continue to onboarding flow
    end
Loading
sequenceDiagram
    participant App as App.vue
    participant BG as Background Service
    participant Screening as Screening Utils
    participant MEWApi as MEW API
    participant UI as Restricted View

    App->>App: onMounted
    App->>Screening: isGeoRestricted()
    Screening->>MEWApi: Fetch geo status
    MEWApi-->>Screening: Status result
    Screening-->>App: geoRestricted flag
    
    alt Geo Restricted
        App->>App: setNetwork triggers checkAddresses()
        App->>Screening: isWalletRestricted(address)
        Screening-->>App: Restriction result
        App->>UI: Render Restricted component
    else Not Restricted
        App->>UI: Render Normal App Layout
    end
Loading
sequenceDiagram
    participant Extension
    participant RoutescanProvider as Routescan Activity Handler
    participant RoutescanAPI as Routescan API
    participant Decoder as decodeTx

    Extension->>RoutescanProvider: getActivity(network, address)
    RoutescanProvider->>RoutescanProvider: Determine endpoint & chainId
    RoutescanProvider->>RoutescanAPI: GET transactions for address
    RoutescanAPI-->>RoutescanProvider: RoutescanTxType[]
    
    loop For each transaction
        RoutescanProvider->>RoutescanProvider: Map to EthereumRawInfo
        RoutescanProvider->>Decoder: decodeTx(rawInfo)
        Decoder-->>RoutescanProvider: Decoded transaction data
        RoutescanProvider->>RoutescanProvider: Construct Activity object
    end
    
    RoutescanProvider-->>Extension: Activity[]
Loading
sequenceDiagram
    participant SwapUI as Swap Best Offer UI
    participant BestOfferList as Best Offer List
    participant ListItem as List Item Component
    participant ProviderInfo as PROVIDER_INFO

    SwapUI->>BestOfferList: trades[], selected trade
    BestOfferList->>ListItem: trade.provider
    ListItem->>ProviderInfo: PROVIDER_INFO[provider]
    ProviderInfo-->>ListItem: {name, icon}
    ListItem->>ListItem: Render provider icon + name
    ListItem-->>BestOfferList: Rendered item
    BestOfferList-->>SwapUI: List with provider info
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • Geo-restriction integration: Multiple code paths (background service, onboard, main app) implement restriction checks with different behaviors (immediate response vs. UI rendering); verify all paths correctly handle the async nature of restriction checks and prevent race conditions.
  • Routescan provider implementation: New activity fetching logic with transaction normalization and decoding; verify correct field mapping from RoutescanTxType to EthereumRawInfo and that all edge cases (missing fields, API errors) are handled.
  • Restricted view state management: New component (restricted/index.vue) introduces multiple state variables (isOpenSign, isOpenForgot, mnemonic, showMnemonic) and modal interactions; verify state transitions and event handling are correct.
  • Changelly floating-rate support: Significant logic extension in method selection based on RBTC detection; verify dynamic method switching (getFixRate vs. getExchangeAmount) works correctly across all code paths and that request/response handling aligns for both methods.
  • Network removal cascade: Four networks removed from multiple locations (enums, handlers, activity providers, ledger configs); verify all references are removed and no dangling imports remain.
  • Swap provider UI plumbing: Provider information threaded through multiple component layers (BestOfferListItem, BestOfferList, SwapBestOfferBlock, SwapBestOffer); verify prop passing and rendering at each level.

Possibly related PRs

Suggested reviewers

  • gamalielhere

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'Release: v2.14.0' accurately describes the main purpose of this changeset, which is a version release with numerous updates across the extension package and dependencies.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (6)
README.md (1)

32-125: New Nibiru entries look good; double‑check removed networks in this list

Adding “Nibiru” and “Nibiru Testnet” to the supported chains section and the final “back to top” link is fine. If this release actually removes support for Canto, Proof of Play Apex, and ZChains in the codebase, consider updating this list to avoid advertising chains that are no longer supported.

Also applies to: 231-231

packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (1)

221-224: Fix selectedFee condition so it’s not always REGULAR

The current expression:

selectedFee.value =
  network.value.name === NetworkNames.Ethereum || NetworkNames.Binance
    ? GasPriceTypes.REGULAR
    : GasPriceTypes.ECONOMY;

is always truthy because NetworkNames.Binance is a non‑empty string, so selectedFee is always set to GasPriceTypes.REGULAR, regardless of network.value.name.

If the intent is to use REGULAR only for Ethereum and Binance, refactor as:

-  selectedFee.value =
-    network.value.name === NetworkNames.Ethereum || NetworkNames.Binance
-      ? GasPriceTypes.REGULAR
-      : GasPriceTypes.ECONOMY;
+  const regularNetworks = [NetworkNames.Ethereum, NetworkNames.Binance];
+  selectedFee.value = regularNetworks.includes(network.value.name)
+    ? GasPriceTypes.REGULAR
+    : GasPriceTypes.ECONOMY;

This keeps the behavior explicit and avoids surprising defaults on other networks.

packages/signers/massa/package.json (1)

35-53: Update @types/node to match monorepo consistency (@24.10.1).

The @polkadot/util-crypto devDependency at ^13.5.8 is correctly placed (used in tests) and consistent with Kadena. However, @types/node lags behind: Massa uses ^22.19.1 while Bitcoin, Ethereum, Kadena, and Polkadot all use ^24.10.1. Align this version for consistency across the monorepo. No public API changes to MassaSigner.

Note: Verification via npm run build and npm run test should be performed locally.

packages/name-resolution/package.json (1)

44-46: Repository URL contains a placeholder.

The repository URL git+https://github.com/<FILL_IT> should be updated to the actual repository path.

   "repository": {
     "type": "git",
-    "url": "git+https://github.com/<FILL_IT>"
+    "url": "git+https://github.com/enkryptcom/enKrypt/tree/main/packages/name-resolution"
   },
packages/swap/src/providers/changelly/index.ts (1)

510-521: Bug: Accessing response.error properties when error may be undefined.

At line 517-518, response.error.code and response.error.message are accessed, but at this point response.error could be undefined (the error check at line 494 already returned null for error responses). This will result in String(undefined) being logged instead of meaningful error info.

       if (!response.result || !response.result[0]?.id) {
         console.warn(
           `Changelly "${method}" response contains no quotes,` +
             ` returning no quotes` +
             `  fromToken=${options.fromToken.symbol} (${params.from})` +
             `  toToken=${options.toToken.symbol} (${params.to})` +
-            `  took=${(Date.now() - startedAt).toLocaleString()}ms` +
-            `  code=${String(response.error.code)}` +
-            `  message=${String(response.error.message)}`,
+            `  took=${(Date.now() - startedAt).toLocaleString()}`,
         );
         return null;
       }
packages/extension/src/libs/background/index.ts (1)

31-41: Based on my verification of the code and the isGeoRestricted() function implementation, I can now provide the rewritten review comment.

Critical startup race condition: geo-restriction gate can be bypassed on early external requests

The geo-restriction check has a genuine startup race vulnerability, though the original analysis misidentifies the root cause:

  1. Startup race / fail-open (VERIFIED)
    #geoRestricted is initialized asynchronously via fire-and-forget .then() in the constructor (lines 57–59) and on window init/unload (lines 92–94). The gate at line 109 only blocks when #geoRestricted !== undefined && true, meaning any external request arriving before the promise resolves will proceed. For restricted users, early requests bypass the check entirely.

  2. Fire-and-forget pattern (minor concern)
    While isGeoRestricted() never rejects—it catches fetch errors internally and returns false—the fire-and-forget calls should still use void prefix to explicitly signal intent and suppress async warnings.

Fix by lazy-initializing and caching the flag inside externalHandler before the gate check:

   async externalHandler(
     msg: Message,
     options: ExternalMessageOptions = { savePersistentEvents: true },
   ): Promise<OnMessageResponse> {
     const { method, params } = JSON.parse(msg.message);
     const _provider = msg.provider;
     const _tabid = msg.sender.tabId;
@@
-    if (this.#geoRestricted !== undefined && this.#geoRestricted) {
+    if (this.#geoRestricted === undefined) {
+      this.#geoRestricted = await isGeoRestricted();
+    }
+    if (this.#geoRestricted) {
       return {
         error: JSON.stringify(
           getCustomError(
             'Enkrypt: Geo restricted https://www.myetherwallet.com/blocked',
           ),
         ),
       };
     }

This ensures all external requests wait for the geo state before proceeding, eliminating the bypass window.

🧹 Nitpick comments (16)
packages/swap/src/providers/okx/index.ts (1)

505-508: Align validation with other methods for consistency.

The validation here is less robust than in getOKXQuote and getOKXSwap. Consider adding error code and array type checks for consistency:

       const data = await response.json();
-      if (data.data) {
-        return data.data;
-      }
-      return [];
+      
+      // Check for error response
+      if (data.code !== undefined && data.code !== "0") {
+        throw new Error(
+          `OKX tokens API error: ${data.code} - ${data.msg || data.message || "Unknown error"}`
+        );
+      }
+      
+      // Validate and return token list
+      if (!data.data || !Array.isArray(data.data)) {
+        logger.warn(`OKX tokens API returned unexpected structure:`, data);
+        return [];
+      }
+      
+      return data.data;
packages/extension/src/libs/backup-state/index.ts (1)

159-211: Consider documenting the intent or making this configurable.

The excludedSignerTypes array is initialized as empty and never populated, making the guard on line 211 currently inert. If this is preparatory code for future exclusion logic, consider:

  • Adding a comment explaining the intended use case
  • Making it a class property or configuration parameter if it will be populated externally
  • Deferring this change until the exclusion feature is actually implemented
packages/extension/src/providers/kadena/networks/index.ts (1)

2-2: Kadena testnet removed from public map; consider cleaning up the underlying definition

Commenting out the kadenaTestnet import and exporting only kadena aligns with dropping Kadena testnet from the public networks map.

If testnet support is fully deprecated rather than just hidden, consider deleting the kadena-testnet network definition and any remaining references instead of keeping a commented import, to avoid stale/dead code lingering in the repo.

packages/signers/massa/src/crypto/cross-browser.ts (1)

124-159: AES‑GCM browser path: consider mirroring the window.crypto guard used in pbkdf2Browser

Behavior-wise this file looks unchanged and the Node/browser interop model still makes sense. One small hardening you might consider (optional) is to add the same window.crypto / feature‑detection guard in aesGCMEncrypt and aesGCMDecrypt that you already use in pbkdf2Browser, so that in environments without WebCrypto you get a clear error instead of a window.crypto access failure.

Example shape:

-  const keyData = await window.crypto.subtle.importKey(
+  const crypto = window.crypto;
+  if (!crypto) throw new Error("Your browser does not expose window.crypto.");
+  const keyData = await crypto.subtle.importKey(
     "raw",
     key,
     { name: "AES-GCM" },
     false,
     ["encrypt"],
   );
-  const encrypted = await window.crypto.subtle.encrypt(
+  const encrypted = await crypto.subtle.encrypt(
     { name: "AES-GCM", iv: iv },
     keyData,
     data,
   );

…and similarly in aesGCMDecrypt.

Also applies to: 176-216

packages/swap/src/common/icons/index.d.ts (1)

1-4: Consider using a more specific type for PNG imports.

The any type provides no type safety for PNG imports. Consider using string or { default: string } to better represent asset imports, which typically resolve to URLs or paths.

Apply this diff for improved type safety:

-declare module "*.png" {
-  const value: any;
-  export = value;
-}
+declare module "*.png" {
+  const value: string;
+  export = value;
+}
packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/types.ts (1)

1-32: Consider typing the dapp field more specifically.

The interface structure looks good overall for representing Routescan transaction data. However, line 14 uses any for the dapp field, which reduces type safety.

If the structure of the dapp field is known or can be inferred from the Routescan API documentation, consider defining a more specific interface or using unknown if the structure is truly dynamic:

   to: {
     id: string;
     isContract: boolean;
     alias?: string;
-    dapp?: any;
+    dapp?: unknown; // or define a DappInfo interface if structure is known
     owner?: string;
     icon?: string;
     iconUrls?: Record<string, string>;
     tags?: string[];
   };

Using unknown forces type checking at usage sites, providing better safety than any.

packages/utils/package.json (1)

33-33: Inconsistent @types/node version across packages.

This package uses ^22.19.1 while other packages (polkadot, bitcoin, hw-wallets) use ^24.10.1. Consider aligning versions to avoid potential type conflicts in the monorepo.

packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue (1)

3-7: Add defensive checks for PROVIDER_INFO access.

The component accesses PROVIDER_INFO[props.pickedTrade.provider] without checking if the provider key exists. If a provider is missing from PROVIDER_INFO, this will cause a runtime error when accessing .icon or .name.

Consider adding a defensive check or computed property:

+const providerInfo = computed(() => {
+  return PROVIDER_INFO[props.pickedTrade.provider] || { 
+    name: 'Unknown', 
+    icon: '' 
+  };
+});

Then use providerInfo.icon and providerInfo.name in the template instead of direct PROVIDER_INFO access.

Also applies to: 48-55

packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/configs.ts (1)

1-8: Tighten NetworkEndpoints typing to NetworkNames for better safety

Using Record<string, string> works but loses type safety around keys. You can narrow this to Partial<Record<NetworkNames, string>> so only valid network names are accepted while keeping it sparse.

-import { NetworkNames } from '@enkryptcom/types';
-
-const NetworkEndpoints: Record<string, string> = {
+import { NetworkNames } from '@enkryptcom/types';
+
+const NetworkEndpoints: Partial<Record<NetworkNames, string>> = {
   [NetworkNames.Nibiru]: 'https://routescan.io',
   [NetworkNames.NibiruTestnet]: 'https://testnet.routescan.io',
 };
packages/swap/src/types/index.ts (1)

135-145: ProviderNameProper looks good; consider adjusting OKX casing

The enum cleanly separates internal ids from display names. One minor nit: for brand consistency you might want "OKX" instead of "Okx".

 export enum ProviderNameProper {
   oneInch = "1inch",
   oneInchFusion = "1inch Fusion",
   paraswap = "ParaSwap",
   zerox = "0x",
   changelly = "Changelly",
   rango = "Rango",
   jupiter = "Jupiter",
-  okx = "Okx",
+  okx = "OKX",
 }
packages/swap/src/configs.ts (1)

3-8: PROVIDER_INFO mapping is solid; narrow icon type for stronger typing

The mapping between ProviderName{ name: ProviderNameProper; icon } looks coherent and matches the imported assets. Since PNG modules are typed, you can strengthen the icon type from any to string (or a shared ProviderIcon alias) to catch misuse at compile time.

-const PROVIDER_INFO: Record<
-  ProviderName,
-  { name: ProviderNameProper; icon: any }
-> = {
+const PROVIDER_INFO: Record<
+  ProviderName,
+  { name: ProviderNameProper; icon: string }
+> = {
   [ProviderName.oneInch]: {
     name: ProviderNameProper.oneInch,
     icon: oneInchIcon,
   },
   [ProviderName.oneInchFusion]: {
     name: ProviderNameProper.oneInchFusion,
     icon: oneInchIcon,
   },
   // ...rest unchanged
 };

Also applies to: 10-16, 24-60, 200-200

packages/extension/src/ui/onboard/App.vue (1)

11-14: Geo check on mount is fine; drop unused async and consider error handling

The new geo-restriction check cleanly redirects restricted users to the help article and closes the window, and the template/CSS changes are purely cosmetic.

Two small tweaks you may want:

  • The onMounted callback is marked async but never awaits; you can safely drop async or switch to await isGeoRestricted() for readability.
  • If isGeoRestricted() can ever reject (e.g., network error), wrapping the call in a try/catch or adding .catch would avoid unhandled promise rejections in the onboarding window.
-onMounted(async () => {
-  isGeoRestricted().then(restricted => {
+onMounted(() => {
+  isGeoRestricted().then(restricted => {
     if (restricted) {
       window.open(
         'https://help.myetherwallet.com/en/articles/12897302-geographic-restrictions-for-mew',
         '_blank',
         'noopener',
       );
       window.close();
     }
   });
 });

Also applies to: 31-49, 73-75

packages/extension/src/libs/utils/screening.ts (2)

1-11: Consider adding a timeout to prevent hanging requests.

The isGeoRestricted function lacks a timeout, which could cause the UI to hang if the API is slow or unresponsive. Consider using AbortController with a reasonable timeout.

-const isGeoRestricted = async (): Promise<boolean> => {
-  return fetch('https://partners.mewapi.io/o/ipcomply')
+const isGeoRestricted = async (): Promise<boolean> => {
+  const controller = new AbortController();
+  const timeoutId = setTimeout(() => controller.abort(), 5000);
+  return fetch('https://partners.mewapi.io/o/ipcomply', { signal: controller.signal })
     .then(async res => {
+      clearTimeout(timeoutId);
       if (res.ok) {
         const json = await res.json();
         return json.isRestricted;
       }
       return false;
     })
-    .catch(() => false);
+    .catch(() => {
+      clearTimeout(timeoutId);
+      return false;
+    });
 };

13-30: Cache lacks TTL - restriction status changes won't be reflected.

The walletCache stores restriction status indefinitely. If a wallet's restriction status changes (e.g., after an appeal), the user would need to restart the extension to see the update. Consider adding a TTL or providing a mechanism to invalidate the cache.

-const walletCache: Record<string, boolean> = {};
+const walletCache: Record<string, { value: boolean; timestamp: number }> = {};
+const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
+
 const isWalletRestricted = async (walletAddress: string): Promise<boolean> => {
-  if (walletCache[walletAddress] !== undefined)
-    return walletCache[walletAddress];
+  const cached = walletCache[walletAddress];
+  if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS)
+    return cached.value;
   const result = await fetch(
     `https://partners.mewapi.io/o/walletscreen?address=${walletAddress}`,
   )
     .then(async res => {
       if (res.ok) {
         const { isRestricted } = await res.json();
         return isRestricted;
       }
       return false;
     })
     .catch(() => false);
-  walletCache[walletAddress] = result;
+  walletCache[walletAddress] = { value: result, timestamp: Date.now() };
   return result;
 };
packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/index.ts (1)

59-86: Unhandled rejection risk: individual decode failures will reject the entire promise.

If decodeTx throws for any transaction, Promise.all will reject and no activities will be returned. Consider using Promise.allSettled or wrapping individual promises with error handling to ensure partial results are still returned.

-  const Promises = activities.map(activity => {
-    return decodeTx(activity, network as EvmNetwork).then(txData => {
+  const Promises = activities.map(activity => {
+    return decodeTx(activity, network as EvmNetwork).then(txData => {
       return {
         from: activity.from,
         to: activity.contractAddress
           ? activity.contractAddress
-          : txData.tokenTo!,
+          : txData.tokenTo ?? activity.to ?? '',
         isIncoming: activity.from !== address,
         // ... rest of mapping
       };
-    });
+    }).catch(() => null);
   });
-  return Promise.all(Promises);
+  const results = await Promise.all(Promises);
+  return results.filter((r): r is Activity => r !== null);
packages/extension/src/ui/action/views/restricted/index.vue (1)

104-104: Consider scoping styles to prevent global conflicts.

The styles are defined without scoped, which means the .settings and .blocked-page classes could conflict with other components. Since this is a new component, consider adding scoped to the style tag.

-<style lang="less">
+<style lang="less" scoped>
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eb027e9 and ad6990d.

⛔ Files ignored due to path filters (8)
  • packages/swap/src/common/icons/0x-logo.png is excluded by !**/*.png
  • packages/swap/src/common/icons/1inch-logo.png is excluded by !**/*.png
  • packages/swap/src/common/icons/changelly-logo.png is excluded by !**/*.png
  • packages/swap/src/common/icons/jupiter-logo.png is excluded by !**/*.png
  • packages/swap/src/common/icons/okx-logo.png is excluded by !**/*.png
  • packages/swap/src/common/icons/paraswap-logo.png is excluded by !**/*.png
  • packages/swap/src/common/icons/rango-logo.png is excluded by !**/*.png
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (75)
  • README.md (2 hunks)
  • package.json (1 hunks)
  • packages/extension-bridge/package.json (2 hunks)
  • packages/extension/package.json (5 hunks)
  • packages/extension/src/libs/background/index.ts (5 hunks)
  • packages/extension/src/libs/backup-state/index.ts (2 hunks)
  • packages/extension/src/libs/dapp-list/index.ts (0 hunks)
  • packages/extension/src/libs/utils/initialize-wallet.ts (1 hunks)
  • packages/extension/src/libs/utils/screening.ts (1 hunks)
  • packages/extension/src/providers/common/libs/new-features.ts (1 hunks)
  • packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts (2 hunks)
  • packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts (0 hunks)
  • packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/configs.ts (1 hunks)
  • packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/index.ts (1 hunks)
  • packages/extension/src/providers/ethereum/libs/activity-handlers/providers/routescan/types.ts (1 hunks)
  • packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts (0 hunks)
  • packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts (0 hunks)
  • packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts (0 hunks)
  • packages/extension/src/providers/ethereum/methods/eth_accounts.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/astr.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/canto.ts (0 hunks)
  • packages/extension/src/providers/ethereum/networks/ftm.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/index.ts (2 hunks)
  • packages/extension/src/providers/ethereum/networks/nibiru-testnet.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/nibiru.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/okc.ts (0 hunks)
  • packages/extension/src/providers/ethereum/networks/palm.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/pop-apex.ts (0 hunks)
  • packages/extension/src/providers/ethereum/networks/story.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/xlayer.ts (1 hunks)
  • packages/extension/src/providers/ethereum/networks/zcd.ts (0 hunks)
  • packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (1 hunks)
  • packages/extension/src/providers/kadena/networks/index.ts (1 hunks)
  • packages/extension/src/providers/kadena/networks/kadena.ts (1 hunks)
  • packages/extension/src/ui/action/App.vue (10 hunks)
  • packages/extension/src/ui/action/views/lock-screen/components/lock-screen-password-input.vue (1 hunks)
  • packages/extension/src/ui/action/views/lock-screen/index.vue (4 hunks)
  • packages/extension/src/ui/action/views/restricted/index.vue (1 hunks)
  • packages/extension/src/ui/action/views/settings/components/settings-inner-header.vue (2 hunks)
  • packages/extension/src/ui/action/views/settings/views/settings-recovery/index.vue (2 hunks)
  • packages/extension/src/ui/action/views/swap/index.vue (1 hunks)
  • packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/components/best-offer-list-item.vue (3 hunks)
  • packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/components/best-offer-list.vue (1 hunks)
  • packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue (4 hunks)
  • packages/extension/src/ui/onboard/App.vue (3 hunks)
  • packages/hw-wallets/package.json (3 hunks)
  • packages/hw-wallets/src/ledger/ethereum/configs.ts (0 hunks)
  • packages/keyring/package.json (2 hunks)
  • packages/name-resolution/package.json (3 hunks)
  • packages/request/package.json (2 hunks)
  • packages/signers/bitcoin/package.json (2 hunks)
  • packages/signers/ethereum/package.json (2 hunks)
  • packages/signers/kadena/package.json (2 hunks)
  • packages/signers/massa/package.json (2 hunks)
  • packages/signers/massa/src/crypto/base58.ts (1 hunks)
  • packages/signers/massa/src/crypto/cross-browser.ts (5 hunks)
  • packages/signers/massa/src/crypto/interfaces/hasher.ts (1 hunks)
  • packages/signers/massa/src/crypto/interfaces/sealer.ts (1 hunks)
  • packages/signers/massa/src/crypto/interfaces/serializer.ts (1 hunks)
  • packages/signers/massa/src/crypto/interfaces/signer.ts (1 hunks)
  • packages/signers/massa/src/crypto/interfaces/versioner.ts (1 hunks)
  • packages/signers/polkadot/package.json (2 hunks)
  • packages/signers/polkadot/src/index.ts (0 hunks)
  • packages/storage/package.json (2 hunks)
  • packages/swap/package.json (3 hunks)
  • packages/swap/src/common/icons/index.d.ts (1 hunks)
  • packages/swap/src/configs.ts (2 hunks)
  • packages/swap/src/index.ts (2 hunks)
  • packages/swap/src/providers/changelly/index.ts (9 hunks)
  • packages/swap/src/providers/okx/index.ts (1 hunks)
  • packages/swap/src/types/index.ts (1 hunks)
  • packages/swap/tsconfig.json (1 hunks)
  • packages/types/package.json (2 hunks)
  • packages/types/src/networks.ts (2 hunks)
  • packages/utils/package.json (2 hunks)
💤 Files with no reviewable changes (11)
  • packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts
  • packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts
  • packages/extension/src/libs/dapp-list/index.ts
  • packages/extension/src/providers/ethereum/networks/okc.ts
  • packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts
  • packages/extension/src/providers/ethereum/networks/canto.ts
  • packages/extension/src/providers/ethereum/networks/pop-apex.ts
  • packages/signers/polkadot/src/index.ts
  • packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts
  • packages/hw-wallets/src/ledger/ethereum/configs.ts
  • packages/extension/src/providers/ethereum/networks/zcd.ts
🧰 Additional context used
🧬 Code graph analysis (6)
packages/extension/src/libs/backup-state/index.ts (1)
packages/types/src/index.ts (1)
  • SignerType (188-188)
packages/signers/massa/src/crypto/base58.ts (1)
packages/signers/massa/src/crypto/interfaces/serializer.ts (1)
  • Serializer (2-5)
packages/signers/massa/src/crypto/interfaces/versioner.ts (2)
packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts (1)
  • version (69-71)
packages/extension/src/ui/action/types/updates.ts (1)
  • Version (3-10)
packages/signers/massa/src/crypto/interfaces/signer.ts (1)
packages/extension/src/providers/solana/libs/wallet-standard/account.ts (1)
  • publicKey (30-32)
packages/swap/src/providers/changelly/index.ts (4)
packages/swap/src/types/index.ts (2)
  • TokenType (49-60)
  • TokenTypeTo (78-80)
packages/swap/src/providers/changelly/types.ts (4)
  • ChangellyApiGetFixRateParams (138-152)
  • ChangellyApiGetFixRateResult (159-258)
  • ChangellyApiGetFixRateForAmountResult (326-437)
  • ChangellyApiCreateFixedRateTransactionResult (558-686)
packages/utils/src/index.ts (1)
  • fromBase (49-49)
packages/utils/src/units.ts (1)
  • fromBase (159-159)
packages/extension/src/libs/background/index.ts (2)
packages/extension/src/libs/utils/screening.ts (1)
  • isGeoRestricted (32-32)
packages/extension/src/libs/error/index.ts (1)
  • getCustomError (27-33)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: buildAll
  • GitHub Check: test
🔇 Additional comments (52)
packages/extension/src/libs/utils/initialize-wallet.ts (1)

6-6: Clean import reordering aligns network dependencies.

The Kadena import repositioning groups all network imports together (lines 2–7) before types and utilities, improving import organization clarity.

packages/extension/src/providers/ethereum/networks/story.ts (1)

13-13: Story chainID update looks correct from a typing/config standpoint

chainID remains a hex string and fits the existing EvmNetworkOptions pattern; no syntax or local-logic issues here. Please just confirm this value matches the official Story mainnet chain ID and that any persisted network metadata (e.g., cached chain IDs in storage) won’t break on upgrade.

packages/extension/src/providers/ethereum/networks/palm.ts (1)

19-19: I'll help you verify this security concern about the hardcoded Infura project ID. Let me investigate the codebase to understand the context and implications.
<function_calls>

cat packages/extension/src/providers/ethereum/networks/palm.ts

</function_calls>

Let me also check other network configurations to see if this is a pattern:
<function_calls>

find packages/extension/src/providers/ethereum/networks -type f -name "*.ts" | head -10

</function_calls>

Now let me search for environment variable patterns and RPC endpoint configurations in the project:
<function_calls>

rg -n "node:|https://" packages/extension/src/providers/ethereum/networks --type ts | head -20

</function_calls>

Let me also check if there are any build-time configurations or environment variable handling:
<function_calls>

rg -n "process.env|INFURA|RPC_URL|API_KEY" packages/extension/src --type ts | head -20

</function_calls>

Let me search for any documentation or comments about API key management:
<function_calls>

find packages/extension -name ".md" -o -name ".txt" | xargs grep -l "API|infura|RPC|key" 2>/dev/null | head -5

</function_calls>

<function_calls>

Infura project ID security best practices public private credentials browser extension

</function_calls>

packages/extension/src/providers/ethereum/networks/xlayer.ts (1)

17-17: Confirm impact of switching from WebSocket to HTTP RPC endpoint

Changing node from a wss:// to an https:// endpoint is fine for standard JSON‑RPC calls, but it will drop WebSocket subscription support (e.g., eth_subscribe) for this network if anything relies on it. Please confirm that:

  • No XLayer‑specific logic depends on WS subscriptions, and
  • https://xlayerrpc.okx.com is the canonical, stable RPC for chain ID 0xc4 and supports the full method set you need.

If both hold, this config change looks good.

packages/extension/src/providers/kadena/networks/kadena.ts (1)

12-15: Community explorer/node endpoints look consistent; please smoke‑test connectivity

Lines 12–15 and 22 switch Kadena to the chainweb-community.org explorer and API while keeping the existing [[txHash]] / [[address]] templating and kadenaApiOptions structure. The config shape looks correct and consistent with other networks, so this change is low‑risk from a code perspective.

Please just ensure, via a quick send‑TX + history lookup flow, that:

  • The new explorer URLs correctly resolve TX and address pages using those placeholders.
  • The new node base URL supports all RPC calls KadenaNetwork performs (e.g., local, send, listen) on mainnet01 chain 1.

Also applies to: 22-22

packages/extension/src/ui/action/views/settings/components/settings-inner-header.vue (1)

3-3: Conditional back button via hasBack is correctly wired and backward compatible

Using v-if="hasBack" with a Boolean prop defaulting to true cleanly introduces conditional back navigation without breaking existing callers. Prop definition and usage are consistent and idiomatic for <script setup>.

Also applies to: 27-30

packages/extension/src/ui/action/views/settings/views/settings-recovery/index.vue (1)

3-7: Propagating hasBack from recovery view to header is consistent and safe

Defining hasBack as a Boolean prop with a default of true and passing it down as :has-back="hasBack" cleanly exposes back-button control to parents while preserving current behavior. The usage is consistent with existing props patterns in this component.

Also applies to: 50-53

packages/signers/massa/src/crypto/base58.ts (1)

1-16: Base58 serializer changes are formatting‑only

This class still cleanly implements Serializer by delegating straight to the underlying encoder/decoder; the only differences are semicolons/quote style. No behavioral concerns here.

packages/signers/massa/src/crypto/interfaces/hasher.ts (1)

2-4: Hasher interface update is style‑only

The added semicolon just aligns this interface with your other crypto interfaces; signature and types are unchanged.

packages/signers/massa/src/crypto/interfaces/signer.ts (1)

2-10: Signer interface formatting looks good

Only semicolons/trailing comma were added; the generatePrivateKey, getPublicKey, sign, and verify contracts remain identical, so there’s no behavioral impact for existing implementations.

packages/signers/massa/src/crypto/interfaces/sealer.ts (1)

2-6: Sealer interface style normalization only

Adding semicolons to seal and unseal keeps this consistent with the other crypto interfaces without changing the API.

packages/signers/massa/src/crypto/interfaces/serializer.ts (1)

2-4: Serializer interface change is cosmetic

The interface still defines the same serialize/deserialize contracts; semicolons just bring it in line with the rest of the interfaces.

packages/signers/massa/src/crypto/interfaces/versioner.ts (1)

2-5: Versioner interface remains the same semantically

attach and extract keep the same parameter and return types; added semicolons are purely stylistic and consistent with other interfaces.

packages/extension/src/providers/ethereum/networks/astr.ts (1)

8-24: Astar RPC endpoint switch looks good

The new wss://astar.api.onfinality.io/public-ws endpoint is well‑formed and consistent with the existing network config; no further changes needed here.

packages/extension/src/ui/action/views/swap/index.vue (1)

960-980: Minor spacing tweak is safe

Reducing .swap__buttons padding to 28px is a harmless visual adjustment and doesn’t affect behavior or layout structure.

package.json (1)

35-41: Tooling devDependency bumps look reasonable

The version bumps for @commitlint/cli, @swc/core, and nodemon are dev‑only and shouldn’t affect runtime behavior; relying on CI and local tooling runs should surface any incompatibilities.

packages/extension-bridge/package.json (1)

47-65: Extension-bridge tooling updates look fine

The updated TS/ESLint/tooling devDependencies are confined to development workflow and should be safe as long as build/lint still pass in this package.

packages/swap/tsconfig.json (1)

18-24: PNG asset inclusion matches new module declarations

Including src/**/*.png in tsconfig.json is consistent with adding *.png module declarations in the swap package and should resolve import typing for icons without affecting TS emit.

packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (1)

233-239: Safer realToAddress default prevents identicon crash

Defaulting realToAddress to '' ensures realToAddress!.toLowerCase() never throws when both tokenTo and toAddress are missing, and aligns with how identiconTo is initialized. This is a solid defensive fix.

packages/signers/ethereum/package.json (1)

33-51: Ethereum signer tooling updates are acceptable

The updated TS/ESLint/vitest/tsup devDependencies are standard maintenance and should be safe so long as build, lint, and vitest run succeed for this package.

packages/keyring/package.json (1)

33-53: Based on the code snippet provided in the review comment, I can see the dependencies listed (lines 33-53), but I'm unable to verify the build and test execution in this environment due to repository access constraints and sandbox limitations (compilers/interpreters are not available).

However, analyzing the review comment itself:

The original review comment requests verification that cannot be satisfied in this environment.

The review comment:

  1. ✅ Correctly identifies the @polkadot/util update to ^13.5.8 (visible in snippet)
  2. ✅ Correctly notes devDependencies are updated
  3. ❌ Requests verification of build/test success, but this cannot be performed in the sandbox

The shell script provided (npm run build and npm run test) cannot execute in this environment because:

  • Compilers and interpreters are not available in the sandbox
  • Build artifacts and npm modules would need to be present

The verification request is not feasible to complete in this context.

**Verification of build and test execution cannot be performed in this environment.**

The @polkadot/util ^13.5.8 update and devDependency versions are visible in the provided code snippet and appear consistent. However, the requested verification (npm run build, npm run test) requires a build environment with compilers and dependencies installed, which is not available in the sandbox.

Manual verification on a local development environment or CI/CD pipeline is recommended to confirm:
- Package builds successfully with updated dependencies
- All tests pass
- No runtime compatibility issues
packages/signers/kadena/package.json (1)

30-48: Based on my verification, I found one factual error in the original review comment that needs to be corrected.

Key Findings:

  1. Factual Error: The original review states "@polkadot/util-crypto runtime dependency," but it is actually in devDependencies (used only in test files, specifically tests/sign.test.ts)
  2. @types/node Version: The version ^24.10.1 is intentional and consistent with other modern signer packages (bitcoin, ethereum, polkadot all use v24.10.1), while the older massa signer uses v22.19.1
  3. Build/Test Scripts: Both exist and are valid, but cannot be executed in the sandbox environment

LGTM! Dependency updates for Kadena signer.

The dependency updates include standard devDependency tooling updates. Note that @polkadot/util-crypto is a devDependency (used in tests), not a runtime dependency. This package uses @types/node@^24.10.1, which aligns with other modern signer packages (bitcoin, ethereum, polkadot) while the massa signer uses v22.

packages/request/package.json (1)

34-49: Yes, please retrieve the packages/request/package.json file from the enkryptcom/enKrypt GitHub repository so I can verify the build and test scripts, and validate the devDependencies listed in the review comment.

packages/extension/src/providers/ethereum/networks/ftm.ts (1)

17-17: Confirmed: RPC endpoint is accessible and functioning correctly, but the practical impact of the protocol change is limited.

The new HTTPS endpoint (https://rpc.fantom.network) returns the correct chain ID (0xfa) with HTTP 200 status. Git history confirms this is indeed a protocol change from wss://fantom-rpc.publicnode.com (WebSocket) to HTTPS.

However, the Fantom network configuration shows activityHandler: wrapActivityHandler(() => Promise.resolve([])), meaning enKrypt does not actively monitor Fantom activity via subscriptions. The eth_subscribe capability exists in the provider's message handler for dApp requests, but Fantom's own activity monitoring was never subscription-based.

The risk is therefore limited to scenarios where a dApp explicitly requests eth_subscribe on Fantom, which would fail over HTTPS (subscriptions require WebSocket). This is a valid concern for completeness, but the endpoint change itself is safe for standard JSON-RPC operations.

packages/storage/package.json (1)

30-45: DevDependency tooling updates verified.

The devDependency version bumps align the package with stable, recent releases of TypeScript (5.9.3), ESLint (9.39.1), Vitest (4.0.10), and related tooling. No runtime dependencies were modified, so these updates don't affect runtime behavior or public APIs. The package's build and test scripts (tsup and vitest) are properly configured to use the updated tooling.

Note: Sandbox environment constraints prevent executing npm run build and npm run test commands, but the configuration changes are valid and the tooling versions are all stable releases with no known compatibility issues.

packages/signers/bitcoin/package.json (1)

32-50: Dev dependency updates look good.

Standard tooling version bumps consistent with the rest of the monorepo.

packages/swap/package.json (1)

25-26: Runtime dependency updates for 1inch SDKs.

Minor version bumps that may include new features or bug fixes. Ensure swap functionality with 1inch provider works as expected.

packages/types/package.json (1)

26-42: Dev dependency updates look good.

Standard tooling version bumps with no functional impact.

packages/hw-wallets/package.json (1)

55-67: Hardware wallet SDK updates.

Updates to Ledger, Polkadot, and Trezor packages. These are security-sensitive dependencies. Verify hardware wallet signing functionality works correctly with these versions.

packages/swap/src/providers/changelly/index.ts (3)

145-163: LGTM - RBTC floating rate support for destination tokens.

The logic correctly mirrors the source token filtering at line 137, enabling RBTC protocol tokens for swaps via floating rates.


297-327: Dynamic method selection for RBTC floating rates.

The implementation correctly branches between getFixRate (fixed rate) and getExchangeAmount (floating rate) based on RBTC ticker presence. The amountFrom parameter is appropriately only set for the floating rate pathway.


696-726: Dynamic transaction creation method for RBTC.

The implementation correctly selects createTransaction for floating rates (RBTC) and createFixTransaction for fixed rates. Error handling is consistent.

packages/signers/polkadot/package.json (1)

49-49: Based on my verification, I've confirmed the following:

Facts about vitest 4.0 upgrade:

  • Web search confirms vitest 4.0 has real breaking changes including: browser provider API changes, coverage remapping changes, config option removals (poolMatchGlobs, environmentMatchGlobs, minWorkers), API changes (test/describe options positioning), and reporter hook removals.
  • This upgrade affects all signer packages uniformly (bitcoin, ethereum, kadena, massa, polkadot all at ^4.0.10).

Code compatibility review:

  • The vitest configuration in packages/signers/polkadot/vitest.config.mts uses only safe, non-deprecated options.
  • Test files follow vitest 4.0 compatible patterns (options passed as second argument, not third).
  • No deprecated imports or patterns detected.

Conclusion:
The original review comment is accurate and appropriate. The upgrade is a genuine major version bump with real breaking changes, and the guidance to verify tests pass and review the migration guide is sound advice.


Major version bump for vitest (3.x → 4.x).

This is a major version upgrade with confirmed breaking changes including browser provider API restructuring, coverage output changes, config option removals (poolMatchGlobs, environmentMatchGlobs, minWorkers), test/describe API changes, and reporter hook modifications. Ensure tests pass and review the vitest 4.x migration guide if any test failures occur.

packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts (1)

8-8: LGTM!

The addition of the RoutescanActivity provider follows the existing pattern and aligns with the new Nibiru network support mentioned in the PR objectives.

Also applies to: 17-17

packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/components/best-offer-list.vue (1)

8-8: LGTM!

The provider prop binding enables the child component to render provider-specific UI, aligning with the PR's goal of displaying provider information in the swap UI.

packages/extension/src/providers/common/libs/new-features.ts (1)

3-3: LGTM!

Adding Nibiru to the new features list appropriately highlights the new network support to users, aligning with the PR objectives.

packages/swap/src/index.ts (1)

5-5: I'll help you verify that PROVIDER_INFO covers all active providers in the Swap class. Let me start by exploring the codebase structure and gathering the necessary information.
<function_calls>

#!/bin/bash

Find the index.ts and configs.ts files

fd -t f "index.ts" packages/swap/src/
fd -t f "configs.ts" packages/swap/src/


</function_calls>

#!/bin/bash # Check the structure of packages/swap directory ls -la packages/swap/src/ 2>/dev/null || echo "Directory not found"

<function_calls>

#!/bin/bash

Get line count and examine index.ts around lines 5 and 280

wc -l packages/swap/src/index.ts
echo "=== Lines 1-15 of index.ts ==="
sed -n '1,15p' packages/swap/src/index.ts
echo "=== Lines 275-285 of index.ts ==="
sed -n '275,285p' packages/swap/src/index.ts


</function_calls>

<function_calls>

#!/bin/bash

Extract PROVIDER_INFO from configs.ts

echo "=== PROVIDER_INFO content from configs.ts ==="
cat packages/swap/src/configs.ts | head -200


</function_calls>

<function_calls>

#!/bin/bash

Check the size of configs.ts first

wc -l packages/swap/src/configs.ts


</function_calls>

<function_calls>

#!/bin/bash

Search for PROVIDER_INFO definition

rg -n "PROVIDER_INFO" packages/swap/src/configs.ts -A 50


</function_calls>

<function_calls>

#!/bin/bash

Find the Swap class and identify all provider instantiations

rg -n "class Swap" packages/swap/src/ -A 200 | head -300


</function_calls>

packages/extension/package.json (2)

83-83: vue-echarts 8.0.1 upgrade is compatible with current dependencies.

The extension already meets all vue-echarts v8 requirements:

  • Vue 3.5.24 satisfies the Vue >= 3.3.0 requirement
  • echarts is already at ^6.0.0 (matching v8's peer dependency)
  • No legacy CSP imports (vue-echarts/csp) are used in the codebase—only standard imports
  • Existing chart component usage in asset-detail-view and network-assets-item relies on standard ECharts v6 APIs

No breaking changes will impact the extension; the upgrade is safe to proceed.


19-19: Kadena endpoint is not a recent change; it is the established mainnet standard throughout the codebase.

The community-hosted endpoint (api.chainweb-community.org) is not a new substitution for api.chainweb.com. Git history shows no recent change, and codebase analysis reveals that the community endpoint is already the standard for mainnet across all Kadena integration points:

  • Node configuration in kadena.ts uses https://api.chainweb-community.org/chainweb/0.0
  • Block explorer endpoints use explorer.chainweb-community.org
  • No references to api.chainweb.com exist for mainnet (only testnet uses api.testnet.chainweb.com)

The endpoint is operational and responds to requests. The 404 response from direct testing is expected behavior; the pactjs contract-generate CLI handles the actual API interaction.

packages/extension/src/providers/ethereum/methods/eth_accounts.ts (1)

23-24: Throttled onboarding call preserves behavior and avoids spam

You still immediately return an empty account list for uninitialized wallets and now throttle onboarding to once per 10 seconds, which should reduce popup spam from polling dapps without changing the response semantics.

packages/extension/src/providers/ethereum/networks/nibiru.ts (1)

7-22: Nibiru network config wiring looks consistent; please verify chain/explorer details

The EvmNetworkOptions shape (names, chainID, RPC, explorer URLs, Coingecko fields, Routescan-based activityHandler) matches existing EVM networks, so structurally this is fine. Since functionality depends on external data, please double-check the chainID, RPC URL, and explorer URLs against Nibiru’s official docs to avoid subtle connectivity issues.

packages/extension/src/providers/ethereum/networks/nibiru-testnet.ts (1)

7-20: Nibiru testnet configuration is consistent with mainnet setup

The testnet options mirror the mainnet config appropriately (testnet explorers, chainID, RPC URL, and isTestNetwork: true) and reuse the same icon. From a wiring perspective this looks correct; only action item is to ensure the chainID/RPC/explorer endpoints match Nibiru’s current testnet details.

packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/components/best-offer-list-item.vue (2)

38-75: LGTM!

Props are properly typed. The select prop type improvement to PropType<() => void> is a good change for type safety.


34-36: The review comment is incorrect and should be resolved.

The import from @enkryptcom/swap/src/types is the correct and only valid way to import ProviderName. Verification of the swap package's main entry point (packages/swap/src/index.ts) confirms that ProviderName is not exported from it—only PROVIDER_INFO is publicly exported. Since ProviderName is not part of the package's public API, the internal path import is necessary and appropriate.

packages/extension/src/providers/ethereum/networks/index.ts (2)

74-75: LGTM!

The Nibiru network imports follow the established pattern for other networks in this file.


158-159: LGTM!

The Nibiru and NibiruTestnet exports are properly added to the network registry, consistent with the naming convention used throughout the file.

packages/extension/src/ui/action/views/restricted/index.vue (2)

84-93: Good security practice: clearing mnemonic on close.

The closeMnemonic function properly clears the mnemonic value after the modal is closed, preventing the sensitive data from lingering in memory longer than necessary.


1-48: LGTM!

The restricted view component provides a clean UX for blocked users while still allowing them to recover their funds via the mnemonic phrase. The support contact options and help link are appropriately placed.

packages/types/src/networks.ts (2)

107-108: LGTM!

The Nibiru and NibiruTestnet enum values are properly added to NetworkNames, following the established naming pattern.


180-180: LGTM!

The Nibiru platform mapping for Coingecko is correctly added. The testnet appropriately doesn't have a Coingecko platform mapping.

packages/extension/src/ui/action/App.vue (2)

281-285: LGTM!

The early return when geo-restricted is appropriate - it prevents unnecessary initialization when the user cannot access the wallet anyway.


2-8: LGTM!

The conditional rendering of the restricted view based on foundRestrictedAddress or geoRestricted provides a clean separation between the normal and restricted UI flows.

@kvhnuke kvhnuke merged commit 9e92e23 into main Nov 27, 2025
5 checks passed
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.

5 participants