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
- Download noir-wallet-extension-0.1.0.zip and unzip it (release notes).
- Open
chrome://extensionsand turn on Developer mode. - Click Load unpacked and choose the unzipped folder. A Chrome Web Store listing is coming soon.
Or build it from source:
cd extension
npm ci && npm run build
# chrome://extensions → Developer mode → Load unpacked → extension/distWith the Stellar Wallets Kit
Noir ships a kit module, so it appears next to Freighter, xBull and the rest:
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 } }.
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 })| Method | Resolves with | Notes |
|---|---|---|
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.code | Meaning |
|---|---|
-1 | Internal, wallet locked, or site not connected |
-2 | Invalid input, or an address the wallet doesn’t hold |
-3 | Wrong network or unsupported |
-4 | The user rejected the request |
With the Noir SDK
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.