Skip to content

prep: release v2.8.0#707

Merged
kvhnuke merged 44 commits intodevelopfrom
devop/release-v2-8-0
Jun 4, 2025
Merged

prep: release v2.8.0#707
kvhnuke merged 44 commits intodevelopfrom
devop/release-v2-8-0

Conversation

@kvhnuke
Copy link
Contributor

@kvhnuke kvhnuke commented May 29, 2025

Summary by CodeRabbit

  • New Features

    • Transaction verification UI now shows both sender and recipient addresses with identicons and explicit "From" and "To" labels.
    • Added the new Ethereum-compatible network "Hemi" with full configuration and explorer integration.
    • Improved gas estimation for staking transactions on RSK networks to enhance transaction reliability.
  • Style

    • Updated styling for transaction verification labels and account info to improve readability.
  • Bug Fixes

    • Short addresses (under 13 characters) are displayed fully without ellipsis in address input components.
  • Chores

    • Upgraded dependencies and development tools across multiple packages for better stability.
    • Refined hardware wallet support by dynamically initializing Trezor Connect for improved environment compatibility.
    • Simplified fiat value formatting by replacing complex formatting functions with direct currency parsing for consistent display.
    • Enhanced name resolution by adding network provider context and supporting PaymentId chains for improved address lookup accuracy.
    • Updated name-resolution package build configuration and module resolution strategy.
    • Overhauled name resolution logic to support multiple protocols (EVM, Solana, PaymentID) with improved error handling.

@coderabbitai
Copy link

coderabbitai bot commented May 29, 2025

## Walkthrough

This update primarily consists of dependency version bumps across multiple package.json files in various packages. Additionally, it introduces UI improvements for transaction verification and address input components, including explicit labeling, identicon display for recipient addresses, and refined address abbreviation logic for short addresses. It also refactors Trezor hardware wallet integration by replacing static imports of TrezorConnect with an asynchronously obtained instance via a new helper function, updating class properties and method calls accordingly. Furthermore, it adds logic to safely adjust gas limits for staking transactions on Rootstock networks. A new Ethereum-compatible network "Hemi" is added with its configuration, enum entry, and activity handler integration. The name resolution system is enhanced to support a broader set of naming protocols including PaymentId, with updated method signatures and resolver logic.

## Changes

| File(s)                                                                                     | Change Summary                                                                                                                  |
|--------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|
| package.json                                                                               | Updated @swc/core devDependency version.                                                                                        |
| packages/extension-bridge/package.json<br>packages/name-resolution/package.json<br>packages/request/package.json<br>packages/signers/bitcoin/package.json<br>packages/signers/ethereum/package.json<br>packages/storage/package.json<br>packages/swap/package.json<br>packages/types/package.json | Bumped several devDependency versions (TypeScript, ESLint, Vitest, etc.).                                                       |
| packages/extension/package.json                                                            | Updated multiple dependency and devDependency versions, including @polkadot, Vue, and others.                                   |
| packages/hw-wallets/package.json                                                           | Bumped package version; updated runtime and devDependencies including hardware wallet libs; added @trezor/connect-web package.  |
| packages/keyring/package.json<br>packages/signers/kadena/package.json<br>packages/signers/polkadot/package.json<br>packages/utils/package.json | Bumped @polkadot and related dependencies; updated devDependencies.                                                             |
| packages/extension/src/providers/common/ui/styles/verify-transaction.less                  | Added new CSS class for label styling; modified styles for account info display.                                                |
| packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue                    | Added "To" section with identicon in UI; introduced identiconTo reactive variable; improved "From" labeling and favicon sizing. |
| packages/extension/src/providers/ethereum/ui/send-transaction/components/send-address-input.vue<br>packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue<br>packages/extension/src/ui/action/views/swap/components/send-address-input.vue | Refined address abbreviation logic to always show full address if under 13 characters.                                          |
| packages/hw-wallets/src/trezor/bitcoin/index.ts<br>packages/hw-wallets/src/trezor/ethereum/index.ts<br>packages/hw-wallets/src/trezor/solana/index.ts | Replaced static TrezorConnect imports with asynchronous dynamic import via new helper; added class property for TrezorConnect instance; updated init and method calls accordingly. |
| packages/hw-wallets/src/trezor/trezorConnect.ts                                            | Added new module exporting async function to dynamically import and initialize TrezorConnect based on environment.              |
| packages/extension/src/providers/ethereum/libs/transaction/gas-utils.ts                    | Added collectiveGasConfig and safeGasForStaking function to safely adjust gas limits for staking transactions on Rootstock.     |
| packages/extension/src/providers/ethereum/libs/transaction/index.ts                        | Updated finalizeTransaction method to apply safe gas adjustment for staking transactions on Rootstock networks.                 |
| packages/extension/src/providers/common/libs/new-features.ts                              | Replaced three network names with a single new network name "Hemi" in newNetworks export.                                        |
| packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts | Added new network endpoint for "Hemi" network.                                                                                   |
| packages/extension/src/providers/ethereum/networks/hemi.ts                                | Added new Ethereum-compatible network configuration for "Hemi".                                                                  |
| packages/extension/src/providers/ethereum/networks/index.ts                               | Imported and added "hemi" network to the exported networks object.                                                               |
| packages/types/src/networks.ts                                                            | Extended NetworkNames enum with new member "Hemi".                                                                                |
| packages/extension/src/providers/bitcoin/types/bitcoin-network.ts                         | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/bitcoin/ui/btc-verify-transaction.vue                     | Changed fiat value formatting from formatFiatValue to parseCurrency filter.                                                      |
| packages/extension/src/providers/bitcoin/ui/send-transaction/components/send-alert.vue    | Changed fiat value formatting in alert messages from formatFiatValue to parseCurrency.                                           |
| packages/extension/src/providers/common/ui/send-transaction/send-alert.vue                | Changed price difference formatting from formatFiatValue to parseCurrency.                                                       |
| packages/extension/src/providers/common/ui/verify-transaction/verify-transaction-amount.vue | Replaced formatFiatValue with parseCurrency for token USD value display.                                                        |
| packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts            | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/ethereum/networks/skale/skale-base.ts                    | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/ethereum/types/evm-network.ts                            | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/kadena/types/kadena-network.ts                           | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue | Replaced formatFiatValue filter with parseCurrency for token balance and price display.                                          |
| packages/extension/src/providers/polkadot/types/substrate-network.ts                      | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/polkadot/ui/send-transaction/components/send-token-item.vue | Replaced formatFiatValue filter with parseCurrency for token balance and price display.                                          |
| packages/extension/src/providers/solana/types/sol-network.ts                             | Removed formatFiatValue usage; replaced with raw string assignments for fiat values.                                              |
| packages/extension/src/providers/solana/ui/sol-verify-transaction.vue                     | Changed fiat value formatting from formatFiatValue to parseCurrency filter and removed explicit dollar sign.                     |
| packages/extension/src/ui/action/composables/account-info.ts                             | Removed formatFiatValue usage; assigned raw string values to fiatAmount.                                                          |
| packages/extension/src/ui/action/utils/filters.ts                                        | Refactored parseCurrency function for improved parsing and formatting; added trailing space in formatDuration return strings.   |
| packages/extension/src/ui/action/views/network-assets/components/network-assets-item.vue | Changed token USD balance display to use raw balanceUSD instead of balanceUSDf.                                                   |
| packages/extension/src/ui/action/views/send-process/components/send-process-amount.vue   | Replaced formatFiatValue with parseCurrency for token USD value display.                                                         |
| packages/extension/src/ui/action/views/settings/components/settings-select.vue           | Changed filter logic to match search input against item.fiat_currency property instead of item string.                           |
| packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/best-offer-error.vue | Replaced formatFiatValue with parseCurrency in error message fiat value formatting.                                               |
| packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/best-offer-block/index.vue | Replaced formatFiatValue with parseCurrency for toTokenPrice display.                                                             |
| packages/extension/src/libs/name-resolver/index.ts                                      | Updated resolveName method signature to accept optional providerChain parameter; passed it to resolveAddress call.              |
| packages/extension/src/providers/common/ui/send-transaction/send-contacts-list.vue       | Changed error log message in isChecked function to a more specific message without logging error object.                         |
| packages/extension/src/providers/ethereum/ui/send-transaction/index.vue                  | Added providerChain argument in call to nameResolver.resolveName.                                                                 |
| packages/extension/src/providers/solana/ui/send-transaction/index.vue                    | Added providerChain argument in call to nameResolver.resolveName.                                                                 |
| packages/extension/src/ui/action/views/asset-detail-view/index.vue                       | Changed token value and USD balance display to use parseCurrency filter instead of direct string interpolation.                   |
| packages/extension/src/ui/action/views/swap/index.vue                                   | Added providerChain argument in call to nameResolver.resolveName; added guard clause and non-null assertions in isDisabled.      |
| packages/hw-wallets/src/trezor/ethereum/configs.ts                                     | Renamed keys in supportedPaths object (Klaytn to Kaia, Syscoin to SyscoinNEVM).                                                  |
| packages/name-resolution/src/index.ts                                                  | Updated resolveAddress method signature to include optional paymentIdChain parameter; reordered name service checks; updated sid resolver call to use paymentIdChain. |
| packages/name-resolution/src/sid/index.ts                                              | Refactored SIDResolver to use @web3-name-sdk/core and related resolvers; added support for PaymentId names; updated resolveAddress and resolveReverseName logic; added timeout support. |
| packages/name-resolution/src/sid/types.ts                                              | Added timeout option to SIDOptions; added Protocol type, PaymentIdChain enum, PAYMENT_ID_CHAINS_MAP, Method type, and TIMEOUT_PRESETS constants. |
| packages/name-resolution/src/sid/utils.ts                                              | Added isValidPaymentId utility function to validate payment ID strings.                                                          |
| packages/name-resolution/src/types.ts                                                  | Updated BaseResolver.resolveAddress method signature to include optional paymentIdChain parameter.                               |
| packages/name-resolution/tests/sid.test.ts                                             | Updated resolveAddress test calls to include "ethereum" as paymentIdChain argument.                                               |
| packages/name-resolution/tsconfig.json                                                | Changed module resolution from "node" to "bundler"; changed module system from "commonjs" to "ES2015".                           |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant UI
    participant Network
    participant Identicon

    User->>UI: Initiate transaction verification
    UI->>Network: Decode transaction
    Network-->>UI: Return transaction data (fromAddress, toAddress)
    UI->>Identicon: Generate identicon for fromAddress
    Identicon-->>UI: Return fromAddress identicon
    UI->>Identicon: Generate identicon for toAddress
    Identicon-->>UI: Return toAddress identicon
    UI-->>User: Display "From" and "To" sections with addresses and identicons

Possibly related PRs

  • enkryptcom/enKrypt#696: Related UI changes adding "To" section and identicon in Ethereum transaction verification component.
  • enkryptcom/enKrypt#699: Similar changes to Trezor hardware wallet integration by replacing static imports with asynchronous instance retrieval.
  • enkryptcom/enKrypt#688: Related addition of the Hemi network configuration and integration.

Suggested reviewers

  • gamalielhere
  • SemajaM


<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between e0bfa674ac15a35ee603a9f49b05ddd5a9239432 and 1cbe741d3372566098c4e05e1a013013ad868c98.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `packages/extension/src/ui/action/views/swap/index.vue` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* packages/extension/src/ui/action/views/swap/index.vue

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: buildAll

</details>

</details>
<!-- internal state start -->


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

<!-- internal state end -->
<!-- tips_start -->

---

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.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=enkryptcom/enKrypt&utm_content=707):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@github-actions
Copy link

github-actions bot commented May 29, 2025

💼 Build Files
chrome: enkrypt-chrome-1cbe741d.zip
firefox: enkrypt-firefox-1cbe741d.zip

💉 Virus total analysis
chrome: 1cbe741d
firefox: 1cbe741d

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: 5

🧹 Nitpick comments (5)
packages/extension/src/providers/ethereum/ui/send-transaction/components/send-address-input.vue (1)

74-74: Consider extracting the magic number to a constant.

The logic improvement is good - short addresses don't need truncation. However, consider extracting the threshold value 13 to a named constant for better maintainability and consistency across the codebase.

+const ADDRESS_TRUNCATION_THRESHOLD = 13;
+
 const visibleAddress = computed(() => {
   let address = props.value;
   if (props.network.isAddress(address))
     address = props.network.displayAddress(props.value);
   if (isFocus.value) return address;
-  if (address.length < 13) return address;
+  if (address.length < ADDRESS_TRUNCATION_THRESHOLD) return address;
   return replaceWithEllipsis(address, 6, 6);
 });
packages/extension/src/ui/action/views/swap/components/send-address-input.vue (1)

83-83: Extract magic number to shared constant for consistency.

Good improvement to show short addresses in full. Since this same threshold (13) is used across multiple address input components, consider extracting it to a shared constant or utility to ensure consistency.

+const ADDRESS_TRUNCATION_THRESHOLD = 13;
+
 const address = computed({
   get: () => {
     let displayAddress: string;
     try {
       displayAddress = props.displayAddress(props.value);
     } catch {
       displayAddress = props.value;
     }
-    if (displayAddress.length < 13) return displayAddress;
+    if (displayAddress.length < ADDRESS_TRUNCATION_THRESHOLD) return displayAddress;
     return isFocus.value
       ? displayAddress
       : replaceWithEllipsis(displayAddress, 6, 6);
   },
   set: value => emit('update:inputAddress', value),
 });
packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue (1)

71-75: Good refactor for readability, but extract magic number.

The refactor from ternary to explicit conditional logic improves readability and maintainability. However, the magic number 13 should be extracted to a shared constant for consistency with similar components.

+const ADDRESS_TRUNCATION_THRESHOLD = 13;
+
 const address = computed({
   get: () => {
     if (isFocus.value) return solAddress.value;
-    if (solAddress.value.length < 13) return solAddress.value;
+    if (solAddress.value.length < ADDRESS_TRUNCATION_THRESHOLD) return solAddress.value;
     return replaceWithEllipsis(solAddress.value, 6, 6);
   },
   set: value => emit('update:inputAddress', value),
 });
packages/extension/src/providers/common/ui/styles/verify-transaction.less (2)

10-16: Extract magic number into a design token
The hard-coded 44px margin can lead to maintenance headaches if the icon size or spacing changes. Define a Less variable (e.g. @labelIndent) that represents the combined icon width + gap, and reuse it here.

+@labelIndent: 44px;

 .provider-verify-transaction {
   &__label {
-    margin: 0 0 4px 44px;
+    margin: 0 0 4px @labelIndent;
   }
 }

177-181: Avoid excessive use of !important
Sprinkling !important makes future overrides brittle and can lead to specificity wars. Instead, increase selector specificity or adjust the cascade order so these rules apply without !important.

 .provider-verify-transaction {
   &__account {
     &-to {
-      font-weight: 400 !important;
-      font-size: 16px !important;
-      line-height: 20px !important;
-      color: @black !important;
+      font-weight: 400;
+      font-size: 16px;
+      line-height: 20px;
+      color: @black;
     }
   }
 }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 97bd787 and 0af7ff6.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (20)
  • package.json (1 hunks)
  • packages/extension-bridge/package.json (2 hunks)
  • packages/extension/package.json (5 hunks)
  • packages/extension/src/providers/common/ui/styles/verify-transaction.less (2 hunks)
  • packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (5 hunks)
  • packages/extension/src/providers/ethereum/ui/send-transaction/components/send-address-input.vue (1 hunks)
  • packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue (1 hunks)
  • packages/extension/src/ui/action/views/swap/components/send-address-input.vue (1 hunks)
  • packages/hw-wallets/package.json (4 hunks)
  • packages/keyring/package.json (2 hunks)
  • packages/name-resolution/package.json (2 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/polkadot/package.json (2 hunks)
  • packages/storage/package.json (2 hunks)
  • packages/swap/package.json (2 hunks)
  • packages/types/package.json (2 hunks)
  • packages/utils/package.json (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: buildAll
  • GitHub Check: test
  • GitHub Check: test
🔇 Additional comments (25)
packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (4)

14-16: Good explicit labeling for clarity.

Adding the explicit "From" label improves UI clarity by making the transaction direction clear to users.


40-40: Good practice to specify image dimensions.

Adding explicit width and height attributes helps prevent layout shifts and improves page loading performance.


83-96: Excellent UX improvement with recipient information.

Adding the "To" section with identicon provides users with clear visibility into the transaction recipient, significantly improving the transaction verification experience.


203-203:

Details

❓ Verification inconclusive

Verify error handling for invalid recipient addresses.

The identicon generation looks correct, but ensure proper error handling if decodedTx.toAddress is undefined or invalid.

Also applies to: 237-239


🏁 Script executed:

#!/bin/bash
# Description: Check how identicon generation handles invalid/undefined addresses in the network implementation

# Search for identicon method implementations to understand error handling
ast-grep --pattern $'identicon($_) {
  $$$
}'

# Also search for any error handling around identicon calls
rg -A 5 -B 5 "identicon.*undefined|identicon.*null|identicon.*error"

Length of output: 117


🏁 Script executed:

#!/bin/bash
set -e

echo "🔍 Scanning for all identicon references and definitions..."
rg -n "identicon" -t ts -t js -C3

Length of output: 69752


Ensure robust error handling for recipient identicon

It looks like we don’t have any guards or fallbacks around network.identicon calls when the recipient address is missing or malformed. Before calling identicon, make sure you validate or default the toAddress value—otherwise an invalid or undefined string could cause the underlying icon generator to throw at runtime.

Please review and, if needed, add a guard or a try/catch with a fallback icon in:

  • eth-verify-transaction.vue
    • Line 203: const identiconTo = ref<string>(network.value.identicon(''));
    • Lines 237–239:
        identiconTo.value = network.value.identicon(
          decoded.toAddress!.toLowerCase(),
        );
package.json (1)

37-37: Approve devDependency version bump for @swc/core
Version for @swc/core has been updated from ^1.11.24 to ^1.11.29, aligning with the overall tooling updates in the monorepo. No breaking changes are expected for a patch-level bump.

packages/types/package.json (1)

27-30: Approve devDependency bumps in @enkryptcom/types
The development dependencies (@types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, tsup, and typescript-eslint) have been updated to their latest patch/minor versions. These changes maintain consistency with the rest of the monorepo’s tooling.

Also applies to: 39-42

packages/request/package.json (1)

34-37: Approve devDependency version upgrades in @enkryptcom/request
The devDependencies (@types/node, ESLint packages, tsup, typescript-eslint, and vitest) were bumped to newer patch/minor versions, in line with the coordinated update strategy. These upgrades should be backward-compatible.

Also applies to: 46-50

packages/storage/package.json (1)

30-34: Approve devDependency bumps in @enkryptcom/storage
Dev dependencies (@types/node, ESLint plugins, tsup, typescript-eslint, and vitest) have been updated to match the monorepo-wide version standards. No functional impact is expected.

Also applies to: 42-45

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

25-28: Approve devDependency updates in @enkryptcom/name-resolution
Updated devDependencies (@types/node, ESLint tooling, tsup, typescript-eslint, and vitest) to their latest patch/minor versions for consistency across packages.

Also applies to: 37-41

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

35-38: Chore: Bump ESLint-related devDependencies
Updating @types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, and eslint to the specified versions aligns this package with the monorepo’s standard tooling versions.

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

35-38: Chore: Bump ESLint-related devDependencies
The versions for @types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, and eslint have been synchronized with other signer packages, ensuring consistent linting across the monorepo.

packages/swap/package.json (1)

42-45: Chore: Bump ESLint-related devDependencies
Aligning @types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, and eslint versions with the rest of the monorepo helps maintain uniform lint and type-check behavior.

packages/keyring/package.json (2)

32-32: Chore: Bump runtime dependency @polkadot/util
Upgrading to ^13.5.1 keeps this package in step with other Polkadot-based modules and pulls in the latest patch fixes.


37-40: Chore: Bump ESLint-related devDependencies
The updates to @types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, and eslint maintain consistency across all packages.

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

47-52: Chore: Bump ESLint-related devDependencies
Synchronizing @types/node, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, bumpp, and eslint ensures the extension-bridge package uses the same development tooling versions as the rest of the monorepo.

packages/utils/package.json (2)

27-27: Verify patch bump of util-crypto dependency
This patch-level update to @polkadot/util-crypto aligns with other packages. Please confirm that no breaking changes were introduced in v13.5.1 before cutting the release.


33-36: Approve alignment of development dependencies
The devDependencies (@types/node, @typescript-eslint, eslint, tsup, vitest) have been bumped to match the monorepo standard. Ensure that linting, type-checking, and test suites pass successfully post-upgrade.

Also applies to: 45-45, 48-49

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

27-28: Approve Polkadot runtime dependency bumps
Upgraded @polkadot/util and @polkadot/util-crypto to ^13.5.1 for consistency. These are patch releases; verify there are no unexpected runtime issues.


34-36: Approve devDependencies synchronization
Development tooling (@types/node, ESLint plugins/parsers, tsup, typescript-eslint, vitest) has been updated to the same versions used across the monorepo. Confirm build and lint pass.

Also applies to: 46-46, 48-49

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

3-3: Approve version bump to 0.0.5
The package version has been incremented to 0.0.5, matching the release plan.


25-28: Approve devDependencies updates
Updated dev tooling (@types/node, ESLint, tsup, typescript-eslint, vitest) to the latest patch/minor versions. Ensure the CI build and tests succeed.

Also applies to: 37-37, 39-40


55-59: Verify hardware-wallet and blockchain dependency bumps
Multiple core dependencies (@ledgerhq/*, Polkadot types/util, Trezor connect, Zondax substrate) have been upgraded. Please confirm compatibility with the hardware wallet flows and run integration smoke tests.

Also applies to: 61-65

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

31-36: Approve Kadena signer devDependencies alignment
All devDependencies related to Polkadot util-crypto, TypeScript types, ESLint, tsup, and vitest have been bumped in line with monorepo standards. Validate the Kadena build and tests pass without regressions.

Also applies to: 45-45, 47-48

packages/extension/package.json (2)

102-108: Verify development toolchain updates
The extension’s devDependencies (TypeScript, Rollup, ESLint, Vitest, etc.) have been upgraded. Ensure the Vite build, type-checking, linting, and tests operate smoothly under the new versions.

Also applies to: 119-119, 121-121, 127-127, 130-131, 133-134, 140-140


26-26:

Details

❓ Verification inconclusive

Critical: Major runtime dependency upgrades—investigate breaking changes
You’ve bumped key Polkadot packages from 15.x to 16.1.1 and updated Vue to 3.5.16 along with other core libraries. These are major/minor upgrades that may introduce API changes. Please audit migration guides, test all extension flows, and update code where necessary.

Also applies to: 41-43, 46-53, 81-81


🏁 Script executed:

#!/bin/bash
echo "----- packages/extension/package.json (first 200 lines) -----"
sed -n '1,200p' packages/extension/package.json

echo
echo "----- Polkadot-related dependencies -----"
grep -R "polkadot" -n packages/extension/package.json || echo "No matches"

echo
echo "----- Vue entries -----"
grep -R "\"vue\"" -n packages/extension/package.json || echo "No matches"

Length of output: 5969


Critical: Audit Breaking Changes for Major Dependency Upgrades

The following runtime dependencies in packages/extension/package.json have been bumped to new major/minor versions and may include API changes:

  • @amplitude/analytics-browser → ^2.17.6
  • Vue → ^3.5.16
  • @polkadot/api, @polkadot/rpc-provider, @polkadot/types, @polkadot/types-known → ^16.1.1
  • @polkadot/extension-inject → ^0.58.10
  • @polkadot/keyring, @polkadot/util → ^13.5.1
  • @polkadot/ui-shared → ^3.14.1
  • @polkadot/wasm-crypto → ^7.4.1

Please:

  • Review the official migration guides for Vue 3.5 and Polkadot 16.x
  • Run full end-to-end tests across all extension flows
  • Update any code relying on removed or changed APIs before merging

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: 4

🧹 Nitpick comments (4)
packages/hw-wallets/src/trezor/trezorConnect.ts (1)

4-4: Use optional chaining for safer Chrome API detection.

The current nested property access could throw if intermediate properties are undefined.

Apply this diff to use optional chaining:

-  if (chrome && chrome.runtime && chrome.runtime.getPlatformInfo) {
+  if (chrome?.runtime?.getPlatformInfo) {
🧰 Tools
🪛 Biome (1.9.4)

[error] 4-4: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

packages/hw-wallets/src/trezor/ethereum/index.ts (1)

45-45: Improve type safety for error handling.

The repeated use of (result.payload as any).error bypasses TypeScript's type checking and could lead to runtime errors if the payload structure changes.

Consider creating a proper type guard or interface for error payloads:

interface TrezorErrorPayload {
  error: string;
}

function isTrezorError(payload: unknown): payload is TrezorErrorPayload {
  return typeof payload === 'object' && payload !== null && 'error' in payload;
}

// Then use it like:
if (!result.success) {
  const errorMessage = isTrezorError(result.payload) 
    ? result.payload.error 
    : 'Unknown Trezor error';
  throw new Error(errorMessage);
}

Also applies to: 79-79, 103-103, 123-123

packages/hw-wallets/src/trezor/bitcoin/index.ts (1)

41-41: Review the necessity of type assertion.

The as any cast on the getPublicKey call might indicate a type mismatch that should be addressed at the type level rather than bypassed.

Consider checking if the TrezorConnect types need to be updated or if there's a more specific type that can be used instead of any.

packages/hw-wallets/src/trezor/solana/index.ts (1)

40-41: Improve type safety for payload access.

Like in other files, the use of (res.payload as any) bypasses type checking.

Consider creating proper interfaces for the Solana-specific response types to improve type safety.

Also applies to: 67-67

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0af7ff6 and 87eda71.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (5)
  • packages/hw-wallets/package.json (4 hunks)
  • packages/hw-wallets/src/trezor/bitcoin/index.ts (6 hunks)
  • packages/hw-wallets/src/trezor/ethereum/index.ts (7 hunks)
  • packages/hw-wallets/src/trezor/solana/index.ts (4 hunks)
  • packages/hw-wallets/src/trezor/trezorConnect.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/hw-wallets/package.json
🧰 Additional context used
🧬 Code Graph Analysis (1)
packages/hw-wallets/src/trezor/solana/index.ts (3)
packages/hw-wallets/src/types.ts (3)
  • getAddressRequest (74-76)
  • AddressResponse (31-34)
  • SolSignTransaction (61-63)
packages/hw-wallets/src/trezor/solana/configs.ts (1)
  • supportedPaths (8-8)
packages/utils/src/index.ts (1)
  • bufferToHex (38-38)
🪛 Biome (1.9.4)
packages/hw-wallets/src/trezor/trezorConnect.ts

[error] 4-4: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: buildAll
  • GitHub Check: test
🔇 Additional comments (5)
packages/hw-wallets/src/trezor/trezorConnect.ts (1)

22-22: Verify the mixed HTTP/HTTPS URL configuration.

The web configuration uses HTTP (http://www.myetherwallet.com) while the webextension uses HTTPS (https://www.enkrypt.com). This inconsistency might be intentional but should be verified.

Please confirm if the mixed protocol usage is intentional or if both should use HTTPS for security consistency.

packages/hw-wallets/src/trezor/ethereum/index.ts (1)

29-29: LGTM: Clean refactoring to instance-based TrezorConnect usage.

The migration from static imports to dynamic instance initialization is well-executed and consistent throughout the class.

Also applies to: 38-38, 74-74, 96-96, 115-115

packages/hw-wallets/src/trezor/bitcoin/index.ts (1)

29-29: LGTM: Consistent refactoring pattern.

The migration to instance-based TrezorConnect usage follows the same clean pattern as the other files.

Also applies to: 38-38, 78-78, 93-93

packages/hw-wallets/src/trezor/solana/index.ts (2)

28-28: LGTM: Consistent refactoring implementation.

The migration to instance-based TrezorConnect usage is implemented consistently with the other wallet providers.

Also applies to: 35-35, 62-62


40-42:

Details

✅ Verification successful

Verify that address and publicKey should be identical.

Both address and publicKey are set to the same decoded value from (res.payload as any).address. This seems unusual as typically these would be different representations.

Please verify if this is correct or if publicKey should come from a different property of the response payload. In most implementations, the public key and address are derived differently.


🏁 Script executed:

#!/bin/bash
# Search for similar address/publicKey handling patterns in Solana-related code
ast-grep --pattern $'return {
  address: $$$,
  publicKey: $$$,
}'

Length of output: 2030


Solana address is the public key – no change needed

The Trezor Connect solanaGetAddress call only returns a base58-encoded public key as address. Since Solana addresses are literally the public key, decoding it once and assigning it to both address and publicKey is correct and matches the patterns used in other chains where the raw public key is exposed (e.g. Bitcoin).

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: 2

🧹 Nitpick comments (1)
packages/extension/src/providers/ethereum/libs/transaction/gas-utils.ts (1)

182-199: Consider making external API URLs configurable for better maintainability.

The hardcoded blockscout.com URLs create external dependencies that could break if the service changes their API or experiences downtime. Consider making these URLs configurable through environment variables or a configuration system.

Additionally, consider adding URL validation and fallback mechanisms for better resilience.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 87eda71 and 3ccec68.

📒 Files selected for processing (2)
  • packages/extension/src/providers/ethereum/libs/transaction/gas-utils.ts (2 hunks)
  • packages/extension/src/providers/ethereum/libs/transaction/index.ts (2 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
packages/extension/src/providers/ethereum/libs/transaction/index.ts (2)
packages/utils/src/index.ts (1)
  • numberToHex (46-46)
packages/extension/src/providers/ethereum/libs/transaction/gas-utils.ts (2)
  • collectiveGasConfig (253-253)
  • safeGasForStaking (252-252)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: buildAll
🔇 Additional comments (3)
packages/extension/src/providers/ethereum/libs/transaction/index.ts (1)

17-18: LGTM! Clean import additions for RSK staking support.

The new imports are correctly added and will be used in the gas limit calculation logic below.

Also applies to: 21-22

packages/extension/src/providers/ethereum/libs/transaction/gas-utils.ts (2)

4-5: LGTM! RSK network imports for configuration.

The imports are correctly added for the RSK network configuration below.


252-253: LGTM! Correct exports for the new gas utilities.

The exports are properly added and match the imports in the transaction index file.

@kvhnuke kvhnuke changed the title prep: release v2.8.0 -2 prep: release v2.8.0 May 30, 2025
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: 5

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a4dce73 and 7dbe5e6.

📒 Files selected for processing (22)
  • packages/extension/src/providers/bitcoin/types/bitcoin-network.ts (1 hunks)
  • packages/extension/src/providers/bitcoin/ui/btc-verify-transaction.vue (1 hunks)
  • packages/extension/src/providers/bitcoin/ui/send-transaction/components/send-alert.vue (1 hunks)
  • packages/extension/src/providers/common/ui/send-transaction/send-alert.vue (1 hunks)
  • packages/extension/src/providers/common/ui/verify-transaction/verify-transaction-amount.vue (1 hunks)
  • packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts (4 hunks)
  • packages/extension/src/providers/ethereum/networks/skale/skale-base.ts (1 hunks)
  • packages/extension/src/providers/ethereum/types/evm-network.ts (2 hunks)
  • packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (6 hunks)
  • packages/extension/src/providers/kadena/types/kadena-network.ts (2 hunks)
  • packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue (1 hunks)
  • packages/extension/src/providers/polkadot/types/substrate-network.ts (1 hunks)
  • packages/extension/src/providers/polkadot/ui/send-transaction/components/send-token-item.vue (1 hunks)
  • packages/extension/src/providers/solana/types/sol-network.ts (1 hunks)
  • packages/extension/src/providers/solana/ui/sol-verify-transaction.vue (1 hunks)
  • packages/extension/src/ui/action/composables/account-info.ts (2 hunks)
  • packages/extension/src/ui/action/utils/filters.ts (2 hunks)
  • packages/extension/src/ui/action/views/network-assets/components/network-assets-item.vue (1 hunks)
  • packages/extension/src/ui/action/views/send-process/components/send-process-amount.vue (1 hunks)
  • packages/extension/src/ui/action/views/settings/components/settings-select.vue (1 hunks)
  • packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/components/best-offer-error.vue (1 hunks)
  • packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • packages/extension/src/ui/action/views/network-assets/components/network-assets-item.vue
  • packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/components/best-offer-error.vue
  • packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue
🧰 Additional context used
🧬 Code Graph Analysis (2)
packages/extension/src/ui/action/composables/account-info.ts (1)
packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts (1)
  • network (265-400)
packages/extension/src/ui/action/utils/filters.ts (2)
packages/extension/src/ui/action/views/settings/store.ts (1)
  • useCurrencyStore (12-41)
packages/extension/src/ui/action/utils/currencyConfig.ts (1)
  • LANG_INFO (173-173)
🪛 Biome (1.9.4)
packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts

[error] 287-287: Avoid the use of spread (...) syntax on accumulators.

Spread syntax should be avoided on accumulators (like those in .reduce) because it causes a time complexity of O(n^2).
Consider methods such as .splice or .push instead.

(lint/performance/noAccumulatingSpread)

⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: buildAll
  • GitHub Check: test
  • GitHub Check: test
🔇 Additional comments (25)
packages/extension/src/providers/common/ui/verify-transaction/verify-transaction-amount.vue (1)

11-11: LGTM! Currency formatting refactoring looks good.

This change simplifies the currency formatting by replacing $filters.formatFiatValue(token.valueUSD).value with the more direct $filters.parseCurrency(token.valueUSD). This aligns with the systematic refactoring described in the AI summary across multiple UI components.

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

75-75:

Details

✅ Verification successful

Verify data structure consistency for filtering logic.

The filtering logic was updated to search within item.fiat_currency instead of directly on the item. This suggests the list items are now objects with a fiat_currency property rather than plain strings.

Please verify that all callers of this component provide list items with the expected fiat_currency property to avoid runtime errors:


🏁 Script executed:

#!/bin/bash
# Description: Verify usage of settings-select component and data structure
# Expected: All list props should contain objects with fiat_currency property

# Find all usages of settings-select component
rg -A 10 -B 5 "settings-select|SettingSelectOption"

# Search for any currency/fiat related data structures
ast-grep --pattern 'fiat_currency: $_'

Length of output: 5978


🏁 Script executed:

#!/bin/bash
# Inspect usage of currencyList and useCurrencyStore in settings-general index
rg -n -C5 "currencyList" packages/extension/src/ui/action/views/settings/views/settings-general/index.vue
rg -n -C5 "useCurrencyStore" packages/extension/src/ui/action/views/settings/views/settings-general/index.vue

# Locate and inspect the definition of useCurrencyStore
rg -l "useCurrencyStore" -n packages/extension/src/ui/action/views/settings
rg -n -C10 "export function useCurrencyStore" $(rg -l "useCurrencyStore" -n packages/extension/src/ui/action/views/settings)

Length of output: 2382


🏁 Script executed:

#!/bin/bash
# Inspect the Pinia store definition for currencyList and its structure
rg -n -C10 "defineStore" packages/extension/src/ui/action/views/settings/store.ts
rg -n -C10 "currencyList" packages/extension/src/ui/action/views/settings/store.ts
rg -n -C10 "currentSelectedCurrency" packages/extension/src/ui/action/views/settings/store.ts

Length of output: 3807


All settings-select items include fiat_currency

I’ve confirmed that:

  • The only <settings-select> usage passes currencyList from useCurrencyStore.
  • useCurrencyStore defines Currency with a fiat_currency: string field.
  • The updated filter item.fiat_currency.includes(...) matches this structure.

No runtime errors expected. The change is safe to merge.

packages/extension/src/ui/action/views/send-process/components/send-process-amount.vue (1)

11-11: LGTM! Consistent currency formatting refactoring.

This change mirrors the same refactoring in other UI components, replacing $filters.formatFiatValue(token.valueUSD).value with the simplified $filters.parseCurrency(token.valueUSD). This maintains consistency across the codebase.

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

19-19:

Details

✅ Verification successful

Verify that parseCurrency provides equivalent formatting to formatFiatValue.

The change from $filters.formatFiatValue(toTokenPrice).value to $filters.parseCurrency(toTokenPrice) simplifies the filter usage, which is good. However, ensure that parseCurrency provides the same currency formatting behavior (decimal places, currency symbols, locale formatting) as the previous formatFiatValue(...).value approach.


🏁 Script executed:

#!/bin/bash
# Verify that parseCurrency filter exists and compare its implementation with formatFiatValue
ast-grep --pattern 'parseCurrency($_)'
echo "---"
ast-grep --pattern 'formatFiatValue($_)'

Length of output: 98


The AST-based search didn’t surface either filter definition—let’s broaden the search across the repo:


🏁 Script executed:

#!/bin/bash
# Search for filter implementations across the codebase
rg -n "parseCurrency" .
rg -n "formatFiatValue" .

Length of output: 6354


Let’s inspect the actual implementations of both filters:


🏁 Script executed:

#!/bin/bash
# Show the top of filters.ts including parseCurrency
sed -n '1,100p' packages/extension/src/ui/action/utils/filters.ts

echo "-----"

# Show where formatFiatValue is brought into filters.ts
grep -n "formatFiatValue" packages/extension/src/ui/action/utils/filters.ts

Length of output: 2352


Let’s extract the full formatFiatValue implementation for comparison:


🏁 Script executed:

#!/bin/bash
# Extract the formatFiatValue function from number-formatter.ts
sed -n '350,550p' packages/extension/src/libs/utils/number-formatter.ts

Length of output: 6231


Approve filter refactor—no changes needed.

parseCurrency handles currency symbols, locale formatting, exchange-rate conversion, and “compact” notation (for millions/billions), replacing the old formatFiatValue(...).value behavior and unifying all fiat formatting. All existing uses of $filters.parseCurrency across the codebase confirm it’s the intended drop-in replacement.

packages/extension/src/ui/action/composables/account-info.ts (1)

5-5: LGTM - Import cleanup.

The removal of formatFiatValue import is consistent with its removal from the code below.

packages/extension/src/providers/polkadot/ui/send-transaction/components/send-token-item.vue (1)

20-21: Currency filter refactor looks consistent.

The changes from $filters.formatFiatValue(...).value to $filters.parseCurrency(...) follow the same pattern as other UI components in this refactor. This simplifies the filter usage and maintains consistency across the codebase.

Ensure that tokenBalance and tokenPrice values are properly handled by the parseCurrency filter, especially considering that tokenPrice might be undefined based on the component logic.

packages/extension/src/providers/solana/ui/sol-verify-transaction.vue (1)

72-72:

Details

✅ Verification successful

LGTM! Currency formatting refactor looks good.

The change from formatFiatValue to parseCurrency simplifies the template logic and aligns with the broader refactoring across the codebase. The addition of parseFloat() wrapper is appropriate for ensuring numeric input.

Please verify that the parseCurrency filter handles edge cases like null, undefined, NaN, and zero values consistently with the previous formatFiatValue implementation:


🏁 Script executed:

#!/bin/bash
# Description: Verify parseCurrency filter implementation and usage
# Expected: Find the filter definition and confirm it handles edge cases

# Search for parseCurrency filter definition
rg -A 10 "parseCurrency.*function|parseCurrency.*=" --type vue --type ts --type js

# Search for other usages to ensure consistency  
rg "parseCurrency" --type vue -A 2 -B 2

Length of output: 180


To locate the parseCurrency implementation and ensure it handles edge cases, let’s search across the entire repo without restricting file types:


🏁 Script executed:

#!/bin/bash
# Search for parseCurrency definition or usage across the repository
rg -n "parseCurrency" .

Length of output: 5830


Let’s inspect the actual implementation of parseCurrency to confirm its handling of null, undefined, NaN, zero, etc.:


🏁 Script executed:

#!/bin/bash
# Show parseCurrency filter definition with surrounding context
rg -n "export const parseCurrency" -C 10 packages/extension/src/ui/action/utils/filters.ts

Length of output: 1126


parseCurrency edge cases are handled correctly

The parseCurrency implementation in packages/extension/src/ui/action/utils/filters.ts already covers NaN and zero by mapping them to 0 and formatting via Intl.NumberFormat. Coupled with the parseFloat() wrapper in the template—converting null or undefined inputs to NaN—this yields a safe, “$0.00”-style output rather than a runtime error.

No further changes needed here.

packages/extension/src/providers/common/ui/send-transaction/send-alert.vue (1)

8-8: LGTM! Consistent currency formatting update.

The change from formatFiatValue to parseCurrency is consistent with the broader refactoring effort and correctly handles the computed priceDifference value.

packages/extension/src/providers/bitcoin/ui/send-transaction/components/send-alert.vue (1)

10-10: LGTM! Consistent with common component pattern.

The currency formatting change matches the pattern used in the common send-alert component and correctly handles the priceDifference computed value.

packages/extension/src/providers/ethereum/types/evm-network.ts (4)

153-153: LGTM! Backend formatting refactor aligns with frontend changes.

The change from formatFiatValue() to direct .toString() moves formatting responsibility to the frontend parseCurrency filter, which is consistent with the UI component updates.


155-156: LGTM! Consistent pattern for native asset value formatting.

Direct string conversion is appropriate here since the frontend will handle formatting via the parseCurrency filter.


270-270: LGTM! Custom token balance formatting follows same pattern.

Consistent with the native asset changes - using direct string conversion instead of backend formatting.


272-273:

Details

✅ Verification successful

LGTM! Custom token value formatting completed consistently.

The refactor is complete and consistent across all asset types (native and custom tokens).

Please verify that the frontend components correctly handle the new unformatted string values from the backend:


🏁 Script executed:

#!/bin/bash
# Description: Verify that UI components using these asset values work with the new format
# Expected: Find components that use balanceUSDf and valuef properties

# Search for usage of the affected properties
rg "balanceUSDf|valuef" --type vue --type ts -A 3 -B 1

# Verify parseCurrency filter can handle the new string format
rg "parseCurrency" --type vue -A 5 -B 5

Length of output: 152


🏁 Script executed:

#!/bin/bash
# Re-run search across all files to locate references to the new properties and parseCurrency

echo "Searching for asset.valuef occurrences..."
rg --word-regexp "valuef" -n .

echo "Searching for balanceUSDf occurrences..."
rg --word-regexp "balanceUSDf" -n .

echo "Searching for parseCurrency usage..."
rg --word-regexp "parseCurrency" -n .

Length of output: 9746


Frontend UI compatibility confirmed

All UI components correctly handle the newly introduced valuef and balanceUSDf string fields, and the existing parseCurrency filter accepts both string and number inputs. No further changes are needed.

• In asset‐detail‐view/index.vue, token.valuef and token.balanceUSDf are rendered directly (pre‐formatted).
• In network‐assets‐item.vue and other lists, numeric token.value/token.balanceUSD are passed through $filters.parseCurrency.
• The parseCurrency(value: string | number): string signature (filters.ts) covers string inputs.

packages/extension/src/providers/polkadot/types/substrate-network.ts (1)

162-162: LGTM! Consistent with fiat formatting standardization.

The change from formatFiatValue(usdBalance).value to usdBalance.toString() aligns with the broader effort to standardize fiat value formatting across the extension, as described in the AI summary.

packages/extension/src/providers/kadena/types/kadena-network.ts (2)

118-118: LGTM! Consistent fiat formatting standardization.

The change to use usdBalance.toString() instead of formatFiatValue aligns with the standardization effort across the extension.


123-123: LGTM! Simplified value formatting.

The direct string conversion marketData[0]?.current_price?.toString() ?? '0' is cleaner and consistent with the fiat formatting standardization.

packages/extension/src/providers/bitcoin/ui/btc-verify-transaction.vue (1)

65-69: LGTM! UI fiat formatting standardization.

The change from $filters.formatFiatValue(fiatValue).value to $filters.parseCurrency(fiatValue) standardizes fiat value formatting in the UI components while maintaining the same conditional logic.

packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts (2)

340-340: LGTM! Consistent with fiat formatting standardization.

The changes to use direct string conversion (usdBalance.toString() and currentPrice.toString()) align with the broader effort to standardize fiat value formatting across the extension.

Also applies to: 345-345


380-380: LGTM! Simplified zero value handling.

Using direct string '0' instead of formatted values for unknown tokens is cleaner and consistent with the standardization effort.

Also applies to: 388-388

packages/extension/src/providers/solana/types/sol-network.ts (2)

127-127: LGTM! Simplified currency formatting approach.

The change from formatted currency to raw string conversion aligns with the broader pattern of moving currency formatting responsibility to the UI layer using parseCurrency.


132-133: LGTM! Consistent with currency formatting changes.

The direct string conversion approach is consistent with the changes to balanceUSDf and the overall strategy to use parseCurrency for UI formatting.

packages/extension/src/ui/action/utils/filters.ts (4)

24-24: LGTM! Proper input sanitization.

The regex replacement correctly handles commas and < symbols, which aligns with the later logic that adds a "< " prefix for very small amounts.


27-28: LGTM! Robust fallback handling.

Good defensive programming with proper fallbacks for both locale ('en-US') and exchange rate (1) when the currency lookup fails.


30-34: Excellent enhancement to currency formatting!

The new implementation properly handles:

  • BigNumber operations with NaN/zero checks
  • Compact notation for large values (>999,999)
  • Special formatting for very small amounts with "< " prefix
  • Proper locale-based currency formatting

This is a significant improvement over the previous implementation.


53-53: LGTM! Consistent formatting with trailing space.

The addition of trailing spaces provides consistent output formatting for duration strings.

Also applies to: 55-55

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: 3

♻️ Duplicate comments (1)
packages/hw-wallets/src/trezor/trezorConnect.ts (1)

3-27: Add error handling for initialization failures.

The function doesn't handle cases where TrezorConnect initialization might fail, which could leave the application in an inconsistent state.

Consider adding try-catch blocks around the initialization calls as suggested in the previous review.

🧰 Tools
🪛 Biome (1.9.4)

[error] 4-4: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🧹 Nitpick comments (5)
packages/hw-wallets/src/trezor/trezorConnect.ts (1)

4-4: Use optional chaining for cleaner Chrome runtime detection.

The static analysis tool correctly suggests using optional chaining instead of multiple && checks.

Apply this diff to improve readability:

-  if (chrome && chrome.runtime && chrome.runtime.getPlatformInfo) {
+  if (chrome?.runtime?.getPlatformInfo) {
🧰 Tools
🪛 Biome (1.9.4)

[error] 4-4: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

packages/name-resolution/src/sid/utils.ts (1)

1-2: Approve the PaymentId validation utility.

The implementation correctly validates the payment ID format with a clear regex pattern. The function is simple, focused, and well-exported.

Consider if the regex should support additional characters commonly used in identifiers:

-const paymentIdRegex = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+$/
+const paymentIdRegex = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+$/

This would allow hyphens and underscores which are common in domain-like identifiers. However, keep the current implementation if the PaymentId specification explicitly requires only alphanumeric characters.

packages/name-resolution/src/sid/types.ts (2)

6-6: Add missing semicolon.

-  timeout?: number
+  timeout?: number;

10-25: Consider generating the mapping from the enum to avoid duplication.

The PAYMENT_ID_CHAINS_MAP duplicates the values from the PaymentIdChain enum, which could lead to maintenance issues if they get out of sync.

-export const PAYMENT_ID_CHAINS_MAP = {
-  "bitcoin": 0,
-  "ethereum": 1,
-  "solana": 2,
-  "tron": 3,
-  "aptos": 4,
-  "sui": 5,
-};
+export const PAYMENT_ID_CHAINS_MAP = Object.entries(PaymentIdChain)
+  .filter(([key]) => isNaN(Number(key)))
+  .reduce((acc, [key, value]) => {
+    acc[key.toLowerCase()] = value;
+    return acc;
+  }, {} as Record<string, number>);
packages/name-resolution/src/sid/index.ts (1)

15-39: Consider externalizing the TLD list for better maintainability.

The hardcoded list of EVM TLDs could be moved to a configuration file or constants module to improve maintainability and make it easier to update.

Would you like me to help create a separate configuration module for managing supported TLDs?

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7dbe5e6 and e0bfa67.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (20)
  • packages/extension/src/libs/name-resolver/index.ts (1 hunks)
  • packages/extension/src/providers/common/ui/send-transaction/send-contacts-list.vue (1 hunks)
  • packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue (6 hunks)
  • packages/extension/src/providers/ethereum/ui/send-transaction/index.vue (1 hunks)
  • packages/extension/src/providers/solana/ui/send-transaction/index.vue (1 hunks)
  • packages/extension/src/ui/action/views/asset-detail-view/index.vue (2 hunks)
  • packages/extension/src/ui/action/views/swap/index.vue (2 hunks)
  • packages/hw-wallets/package.json (4 hunks)
  • packages/hw-wallets/src/trezor/bitcoin/index.ts (7 hunks)
  • packages/hw-wallets/src/trezor/ethereum/configs.ts (1 hunks)
  • packages/hw-wallets/src/trezor/solana/index.ts (4 hunks)
  • packages/hw-wallets/src/trezor/trezorConnect.ts (1 hunks)
  • packages/name-resolution/package.json (3 hunks)
  • packages/name-resolution/src/index.ts (1 hunks)
  • packages/name-resolution/src/sid/index.ts (1 hunks)
  • packages/name-resolution/src/sid/types.ts (1 hunks)
  • packages/name-resolution/src/sid/utils.ts (1 hunks)
  • packages/name-resolution/src/types.ts (2 hunks)
  • packages/name-resolution/tests/sid.test.ts (4 hunks)
  • packages/name-resolution/tsconfig.json (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • packages/extension/src/providers/common/ui/send-transaction/send-contacts-list.vue
  • packages/extension/src/ui/action/views/asset-detail-view/index.vue
  • packages/hw-wallets/src/trezor/ethereum/configs.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/name-resolution/package.json
  • packages/hw-wallets/package.json
  • packages/extension/src/providers/ethereum/ui/eth-verify-transaction.vue
  • packages/hw-wallets/src/trezor/solana/index.ts
  • packages/hw-wallets/src/trezor/bitcoin/index.ts
🧰 Additional context used
🪛 Biome (1.9.4)
packages/name-resolution/src/sid/index.ts

[error] 103-105: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

The declaration is defined in this switch clause:

Unsafe fix: Wrap the declaration in a block.

(lint/correctness/noSwitchDeclarations)


[error] 108-110: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

The declaration is defined in this switch clause:

Unsafe fix: Wrap the declaration in a block.

(lint/correctness/noSwitchDeclarations)

packages/hw-wallets/src/trezor/trezorConnect.ts

[error] 4-4: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: buildAll
  • GitHub Check: test
  • GitHub Check: test
🔇 Additional comments (15)
packages/hw-wallets/src/trezor/trezorConnect.ts (2)

1-2: LGTM!

Clean import statement for the TrezorConnect type definition.


30-31: LGTM!

Clean default export of the getTrezorConnect function.

packages/name-resolution/tsconfig.json (2)

5-5: Good modernization of module resolution strategy.

The change to "bundler" moduleResolution is appropriate for modern build tools and aligns with the package refactor to use newer dependencies.


11-11: Approve ES module target update.

Updating to "ES2015" modules enables better tree-shaking and modern ES module syntax, which is consistent with the overall package modernization.

packages/extension/src/providers/ethereum/ui/send-transaction/index.vue (1)

681-685:

Details

✅ Verification successful

Approve the addition of provider parameter to name resolution.

The change correctly adds the network provider as a third parameter to enhance name resolution accuracy. The implementation aligns with the updated method signature.

Verify that the props.network.provider is always defined and is of type string:


🏁 Script executed:

#!/bin/bash
# Description: Verify network provider property definition and usage
# Expected: Find the network interface/type definition with provider property

# Search for network type definitions
ast-grep --pattern 'interface $_ {
  $$$
  provider: $_
  $$$
}'

# Search for EvmNetwork type definition specifically
rg -A 10 "interface EvmNetwork\|type EvmNetwork"

Length of output: 6464


🏁 Script executed:

#!/bin/bash
# 1. Locate ProviderName definition to confirm it's a string-based type
rg -n "export type ProviderName" -A 5 .

# 2. Inspect the props declaration in the Vue component to determine the type of `network`
sed -n '1,200p' packages/extension/src/providers/ethereum/ui/send-transaction/index.vue | sed -n 's/</\</g'

Length of output: 149


🏁 Script executed:

#!/bin/bash
# 1. Find where ProviderName is defined and verify it’s a string alias
rg -n "type ProviderName" -A 5 packages/extension/src/types

# 2. Inspect the Vue component props declaration to confirm the type of `network` and its `provider` field
rg -n "defineProps" -A 20 packages/extension/src/providers/ethereum/ui/send-transaction/index.vue
rg -n "props: {" -A 20 packages/extension/src/providers/ethereum/ui/send-transaction/index.vue

Length of output: 811


🏁 Script executed:

#!/bin/bash
# 1. Locate EvmNetwork type definition and inspect its provider field
rg -n "EvmNetwork" -A 10 .

# 2. Locate ProviderName alias to confirm it's a string-based type
rg -n "export type ProviderName" -A 5 .

# 3. Show import of EvmNetwork in the Vue component
rg -n "import.*EvmNetwork" -A 2 packages/extension/src/providers/ethereum/ui/send-transaction/index.vue

Length of output: 79899


Approve name resolution provider addition

The change correctly passes props.network.provider—typed as ProviderName (a string alias via BaseNetworkOptions)—to resolveName, ensuring the provider parameter is always defined and string-based. The existing as string cast is safe and can even be omitted if you prefer.

packages/name-resolution/tests/sid.test.ts (2)

44-47: Approve test parameter update with similar verification needed.

The test correctly includes the new "ethereum" parameter for the "sdfsfsdfsdfsdf.bnb" domain resolution, maintaining the same pattern as the other test.


14-14:

Details

❓ Verification inconclusive

Verify chain parameter consistency in test.

The test correctly adds the new parameter, but there's a potential inconsistency: resolving "spaceid.arb" (Arbitrum domain) while passing "ethereum" as the chain parameter.

Verify if this cross-chain resolution pattern is intentional:


🏁 Script executed:

#!/bin/bash
# Description: Check if cross-chain domain resolution is expected behavior
# Expected: Find documentation or examples of resolving .arb domains with ethereum chain

# Search for examples of resolveAddress usage patterns
rg -A 3 -B 3 'resolveAddress.*ethereum'

# Search for domain-to-chain mapping logic
rg -A 5 'arb.*ethereum|ethereum.*arb'

Length of output: 1123


🏁 Script executed:

#!/bin/bash
# Locate the SIDResolver class and its resolveAddress method implementation
rg "class SIDResolver" -A10 -B5 packages/name-resolution
rg "resolveAddress(" -A5 -B5 packages/name-resolution

Length of output: 1302


Unable to locate resolveAddress implementation – manual verification required

I wasn’t able to find the resolveAddress method in the SIDResolver code to confirm if resolving “.arb” domains on the “ethereum” chain is supported. Please check whether cross‐chain resolution for Arbitrum domains via the Ethereum chain is intentional and documented.

packages/extension/src/providers/solana/ui/send-transaction/index.vue (1)

707-711: Enhancement looks good - improved name resolution with provider context.

The addition of the network provider parameter to the resolveName call is consistent with the broader name resolution system enhancement. This provides more precise address resolution by including network provider context.

packages/name-resolution/src/types.ts (1)

149-151: Good foundational type enhancement for PaymentId support.

The addition of the optional paymentIdChain parameter to the abstract resolveAddress method is well-designed, maintaining backward compatibility while enabling enhanced name resolution capabilities for PaymentId namespaces.

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

407-411: Consistent name resolution enhancement.

The addition of the network provider parameter follows the same pattern as other UI components, ensuring consistent enhanced name resolution across the application.


780-780: Improved type safety with non-null assertion.

The addition of the non-null assertion (!) before calling toString() on the balance improves type safety and prevents potential runtime errors.

packages/name-resolution/src/index.ts (3)

44-44: Minor formatting improvement.

Addition of trailing comma follows good JavaScript/TypeScript practices and improves consistency.


50-51: Proper method signature enhancement.

The addition of the optional paymentIdChain parameter aligns with the type definition changes and supports the enhanced name resolution capabilities.


58-59: Correct parameter usage for SID resolver.

The change from using coin to paymentIdChain parameter for the SID resolver call is appropriate, given that SID now handles PaymentId names with a different resolution approach than traditional coin-based addresses.

packages/extension/src/libs/name-resolver/index.ts (1)

17-21: LGTM!

The addition of the optional providerChain parameter is implemented correctly and maintains backward compatibility.

@kvhnuke kvhnuke changed the title prep: release v2.8.0 prep: release v2.8.0 @coderabbitai Jun 2, 2025
@kvhnuke kvhnuke changed the title prep: release v2.8.0 @coderabbitai prep: release v2.8.0 Jun 2, 2025
@kvhnuke kvhnuke merged commit 56d6d8b into develop Jun 4, 2025
5 checks passed
@kvhnuke kvhnuke deleted the devop/release-v2-8-0 branch June 4, 2025 17:56
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.

4 participants