Development of a Browser Crypto Wallet Extension for EVM and Solana

Clients lose access to accounts and run into signing failures right in the browser. We develop turnkey crypto wallet browser extensions: we design signing logic, keep keys on the user side, and deliver a finished product with documentation to the team. Support load decreases, and a recurring class of signing failures goes away.

Blockchain Development Services

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1375
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1349
  • B2B Advance company logo design
    B2B Advance company logo design
    794
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1087
  • AIDER company logo development
    AIDER company logo development
    1032
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1129

Browser crypto wallet extension: where signing logic breaks

Transaction signing in an extension runs in several contexts at once: the site tab, the popup, and the background part. Each keeps its own copy of state — operation queue, active network, account.

While the copies diverge, the browser crypto wallet extension passes checks and signs something other than what the user sees on screen.

The first failure is desynchronization between windows. An operation leaves the popup, a second wallet tab opens immediately, and both show different operation numbers. One transaction goes through, the second is rejected by the network, while in the UI both look sent.

The second is loss of wallet session: the browser stops the background process when idle, the decryption key leaves memory, and the confirmation window hangs without a response.

The most costly is a hung confirmation window. The user does not understand whether the operation left or not, closes the window and clicks "Send" again.

If the request is reassembled from the same data set, the network gets a duplicate with the same number — and either rejects it or processes it twice.

That is why transaction signing in an extension is made retryable: the queue lives outside the window, and the journal records at which step each operation stopped.

In extension wallet development, we start with an explicit state model: a single signing queue for the entire wallet, access recovery via encrypted storage, separate accounting of already sent requests. Below is how it is arranged and where exactly signing logic breaks.

Implementation effects: operation speed, failures, support load

The result of extension implementation is visible not by the finished interface, but by wallet behavior in real hands.

We accept work by five metrics: share of successful operations, support ticket flow, access recovery time, eliminated class of failures, and stability during updates.

Share of successful operations

We run signing and sending on every operation type and on all supported networks, including network switching and re-signing. The share of operations that reach confirmation without manual prompts reaches a level where retries are no longer the norm.

Eliminated class of failures

We close failures due to insufficient funds for fees, stale transaction queue, and rejected signature. Instead of a "hung" operation, the user sees the reason and a clear next step.

Wallet access recovery

Import by seed phrase into a new browser or another device works as a standard scenario: access is restored in minutes, without support correspondence.

User support load

Clear error wording, status screens, and step-by-step hints cut the flow of repetitive questions. Those who previously wrote "it's not sending" solve the task inside the extension.

Stability during updates

We run version updates and local storage migration before release so that familiar scenarios of mass wallets like MetaMask do not break. The user does not lose accounts and network settings.

Wallet build options and when each approach is appropriate

The build is determined by three things: how many networks need to be supported at launch, where private keys live, and who signs the transaction. Below are four approaches found in practice, with their limitations.

Option When it fits Limitations
Single-network extension First release, one network, need fast launch and minimal attack surface A second network requires a separate signing layer and storage rework
Multi-network extension with shared storage Product is designed for EVM and Solana from the start: one interface, one account list Different signing schemes, different address formats, higher cost of error in key isolation
Extension with external signer Large amounts, requirement not to store keys on device Dependence on hardware signer, narrower set of supported networks
Embeddable wallet in an existing product Wallet is an addition to a service, not a standalone product Inherits platform limitations, core updates together with the main product

How to choose

The difference shows at the support stage. A single-network extension is faster to release, a multi-network one is harder to maintain, and a hardware signer removes some key storage risks but adds device dependence.

Therefore in practice we more often build a hybrid: keys for everyday operations remain in the extension, large ones — behind a hardware signer.

Implementation stages: from audit to handover to the team

The order of stages is fixed: each next one relies on the artifacts of the previous. Until the key storage scheme is described, signing implementation turns into rework, so we start with product analysis and finish with support — there documentation matters more than code.

  1. Analysis of the current product. We look at support for EVM networks and Solana, node connectivity, and work with hardware signatures. The output is a module map and a list of bottlenecks: where signing logic is duplicated, where state lives longer than needed.
  2. Key and access storage scheme. We determine where the seed phrase is stored, how it is encrypted with a passphrase, what goes into background process memory, and what goes into secure storage. Separately — auto-lock and behavior during extension updates.
  3. Wallet audit. We check trust boundaries: provider injection into the page, handling of site responses, verification of network and recipient address before signing, protection against transaction parameter substitution. The result is reproducible scenarios with priorities.
  4. Implementation. Blocks are independent: interface, background logic, bridge to sites, network and token support. Each is covered by tests.
  5. Failure scenario testing. Loss of connection to a node, rejected signature, balance desynchronization, extension update on a live installation — we run each and record behavior.
  6. Release preparation. Dependency review, minimization of requested permissions, access recovery instructions, storage migration check between versions.
  7. Project handover to the team. Repository, storage scheme, release procedure, access to build and error log — plus a support window until the team conducts a release on its own.

Deliverables: schemes, procedures, documentation

Deliverables are not a folder with source code, but a set of artifacts tied to the build tag: using them, the client's team reproduces the release, conducts an audit, and changes contractors without stopping the product. Below is what exactly remains in your repository and internal knowledge base after handover.

  • Build configurations — profiles for Chromium and Firefox, separate manifests, environment flags (load, test, production), reproducible build instructions: the release is built from a tag with one command, without manual edits.
  • Key storage scheme — where exactly the private key and seed phrase are encrypted, by which algorithm, what physically never leaves the user's device, and which metadata goes to the server side.
  • Backup scheme — list of backups (encrypted storages, account metadata, access node configurations), frequency, retention depth, and step-by-step recovery procedure with verification on a copy.
  • Key access policy — roles and separation of duties, conditions under which an operation with the release signing key is initiated, and a log showing who did what.
  • Update procedure — how change verification works, who signs the build, the order of staged rollout, conditions and timelines for rollback to the previous version, and the policy for supporting old versions among users.
  • Wallet documentation — architecture diagrams, description of transaction and signing flows, public interface specifications, instructions for local launch and debugging.
  • Incident handling procedure — incident levels, response time for each, escalation procedure, and analysis templates, so that support works by rules, not from memory.

Case study: how a recurring class of signing failures was eliminated

Where operations broke

Our browser crypto wallet worked with two network families: EVM-compatible and Solana.

Signing models, message formats, and status tracking methods differ there, and at the junction signing failures arose: in one case confirmation was lost when connection to a network node dropped, in another the transaction did not reach the network due to a stale operation number, while the interface showed "not sent" on top of an operation that had already gone through.

According to extension measurements, every ninth operation remained unfinished, and 40% of support requests were specifically about signing and hung transactions. User access recovery took up to 25 minutes and almost always required manual analysis by an engineer.

What we changed

We built a unified signing journal with a stable operation key: the identifier is assigned before sending, retry attempts are filtered out, and status survives extension restart and network switching.

For hardware signing, including Ledger, we added a repeated confirmation request without losing the prepared transaction. Separately, we described the access recovery scenario: the user sees at which step the discrepancy is and what to do, instead of manual analysis with support.

A month later, the share of unfinished operations fell to 0.9% — one in a hundred plus. Access recovery time decreased from 25 minutes to 1-2 minutes of self-service actions.

Requests about signing dropped from 40% to 6% of all, and manual analyses — from several hundred per month to isolated ones. The class of failures that dragged along correspondence and lost operations stopped reproducing.

How does a crypto wallet in an extension differ from a server-side signer?

The difference is where the private key physically resides and who can sign an operation without the owner's knowledge.

With local key storage, the key is encrypted with a password and remains in isolated browser storage: the transaction is assembled on the page, the signature is computed on the device, and only the signed package goes outside.

The server sees the address and request history but cannot dispose of funds — the key does not leave the device.

With server-side operation signing, the wallet trust model is inverted: the key lives in the service's secure perimeter, and the extension becomes an interface to it.

The user gets login from any device and account recovery, but every operation passes through someone else's infrastructure. An error in access rights or compromise of the perimeter exposes not one wallet, but the entire pool.

Responsibility for keys is distributed in the same way. In the local model, the user bears it: losing the password or clearing the browser profile means access is lost irrevocably, and support can only diagnose.

In the server model, the service takes on obligations — a rotation procedure, signing journal, role separation, and access recovery procedure are required.

Therefore, for a non-custodial product, we build an extension with local signing and key export for transfer. Where users are led by a platform, server-side signing provides managed onboarding — provided that the perimeter and logging are designed from the very beginning.

Open questions: what is clarified before work starts

Before starting, we separately go through the points where the client usually has doubts: how the extension gets into browser catalogs, what happens when a new network is added, what confirms signing correctness, and where our area of responsibility ends. Below are the same answers we give at a technical meeting, without generalities.

How is the extension updated after publication?

The build goes to official browser catalogs — Chrome Web Store and similar ones review it before publication, so we plan release timelines in advance.

Browser auto-update pulls the new version on the next launch, and migration of key and settings storage maintains compatibility with the two previous states — an update does not erase imported accounts.

What if a new network is needed after release?

Support for new networks with a shared address and signing model is added by configuration: identifier, node addresses, asset display rules.

A network with a different architecture is a separate transaction format and its own confirmation logic, so we plan it as a standalone stage, not as a list edit.

What confirms signing correctness?

Signing testing is built on a set of vectors with known "data — signature" pairs, running on test networks, and checking address recovery from the signature.

Separately, we go through scenarios with hardware wallets and manual confirmation — that is where the parties' expectations most often diverge.

Where is the boundary of responsibility?

We fix the division of responsibility in writing before work starts.

We are responsible for the extension code, build, publication, documentation, and the procedure for releasing updates; the client — for developer accounts in catalogs, the legal side, and the decision to support specific networks. Private keys do not leave the user's device and are not stored on our side.

What to send for an estimate and how we calculate scope of work

So that the wallet development estimate is not based on guesses, we need a set of inputs — from target networks to key storage policy. The more accurately the scope is described, the fewer assumptions in the estimate and the faster we will return with a stage plan.

  • Networks and accounts. Only EVM networks or EVM together with Solana, whether multi-account is needed, network switching, and manual addition of an arbitrary network.
  • Key storage. Where the encrypted mnemonic phrase is stored, password and auto-lock policy, whether hardware wallet support is needed.
  • Signing scenarios. Transfers, message signing, connection to decentralized applications, behavior with multiple open tabs and parallel requests.
  • Interfaces. Popup, side panel, or separate page, first-run screens, recovery and import of an existing wallet.
  • Data. In-house or external sources of balances, transaction history, and rates, requirements for local storage and operation when the network is unavailable.
  • Security and delivery. Whether external audit is needed, extension permission restrictions, update channel, and target browsers.
  • Design and acceptance. Layouts or reference, localization, readiness criteria, and test scenarios.

Send what you already have: a draft of requirements, a list of scenarios, links to similar wallets. We will analyze the inputs, ask clarifying questions, and return with an estimate and stage plan — then you decide what scope to move with. Describe the task, and we will discuss it substantively, without shifting design onto your side.