Docs

Browser extension

Noir for Chrome: the window.noir.stellar SEP-43 provider, Stellar Wallets Kit support, and how dApps connect and request signatures.

Noir for Chrome is a Stellar wallet that any dApp can connect to. Users can import the same recovery phrase as the Noir app (SEP-5), and every connection and signature is approved in a Noir window that shows exactly what is being signed.

Install

  1. Download noir-wallet-extension-0.1.0.zip and unzip it (release notes).
  2. Open chrome://extensions and turn on Developer mode.
  3. Click Load unpacked and choose the unzipped folder. A Chrome Web Store listing is coming soon.

Or build it from source:

bash
cd extension
npm ci && npm run build
# chrome://extensions → Developer mode → Load unpacked → extension/dist

With the Stellar Wallets Kit

Noir ships a kit module, so it appears next to Freighter, xBull and the rest:

ts
import { StellarWalletsKit } from '@creit-tech/stellar-wallets-kit'
import { defaultModules } from '@creit-tech/stellar-wallets-kit/modules/utils'
import { NoirModule } from '@creit-tech/stellar-wallets-kit/modules/noir'

StellarWalletsKit.init({ modules: [...defaultModules(), new NoirModule()] })

The module is being proposed to the kit; until it is published there, copy extension/kit-module/noir.module.ts into your app.

Direct provider: window.noir.stellar

A SEP-43 provider, injected before your page’s scripts run. Methods never reject; they resolve with the result or { error: { code, message } }.

ts
const noir = window.noir?.stellar
if (!noir) return showInstallNoir()

const { address, error } = await noir.requestAccess()
if (error) return console.warn(error.code, error.message)

const { signedTxXdr } = await noir.signTransaction(tx.toXDR(), { networkPassphrase: Networks.TESTNET })
MethodResolves withNotes
requestAccess(){ address }Asks the user to connect this site (once)
getAddress(){ address }No prompt once the site is connected
getNetwork(){ network, networkPassphrase }TESTNET or PUBLIC
signTransaction(xdr, opts?){ signedTxXdr, signerAddress }Refuses another network without prompting
signAuthEntry(preimageXdr, opts?){ signedAuthEntry, signerAddress }Signature over sha256(HashIdPreimage)
signMessage(message, opts?){ signedMessage, signerAddress }SEP-53
isConnected() · isAllowed(){ isConnected } · { isAllowed }
error.codeMeaning
-1Internal, wallet locked, or site not connected
-2Invalid input, or an address the wallet doesn’t hold
-3Wrong network or unsupported
-4The user rejected the request

With the Noir SDK

ts
import { NoirAgentClient, noirExtensionSigner } from '@noir-wallet/agent-sdk'

const merchant = await noirExtensionSigner()
await new NoirAgentClient().claim({ merchant, token: asset })

See the SDK reference for every operation.

Security model

  • The recovery phrase is encrypted with AES-256-GCM under a PBKDF2-SHA256 (600k) key from the user’s password.
  • The unlocked key lives only in session memory and auto-locks after 15 minutes.
  • Sites get the address only after the user connects them; the origin comes from the browser, not the page.
  • Auth entries are checked against the wallet’s network before signing.