Aubergine

Für Entwickler

Der Entwickler-Modus ist kein zweites Produkt und kein kostenpflichtiges Extra, sondern ein Schalter in derselben Erweiterung. Was er freischaltet und wie du dagegen entwickelst, steht hier.

Projektstand

Diese Wallet läuft im Testnetzwerk (kein echtes Geld) und ist noch nicht in den Browser-Stores veröffentlicht. Es liegt kein Sicherheitsaudit vor.

Was der Entwickler-Modus freischaltet

Vollständige Liste — es gibt nichts, was zusätzlich noch hinter einer weiteren Ebene steckt.

  • Netzwerkauswahl um Futurenet erweitert (ein eigener Endpunkt ist geplant, aber noch nicht auswählbar); Testnet und Hauptnetzwerk stehen auch im Einsteiger-Modus zur Wahl. Mainnet und Futurenet fragen beim ersten Auswählen eine optionale Browser-Berechtigung an
  • Transaktionsansicht: Klartext plus ausklappbares XDR/Base64
  • Soroban-Contract-Aufrufe signieren — Contract und Funktion werden benannt, die Argumente noch nicht dekodiert
  • dApp-Connector mit Freigabeliste je Herkunft (Origin)
  • Asset-Freigaben für beliebige Herausgeber, Limit frei editierbar (im Einsteiger-Modus stattdessen eine kurze kuratierte Liste)
  • Signer-Übersicht für Multisig-Konten (Anzeige in Phase 1)
  • Manuell überschreibbare Netzwerkgebühr
  • Numerische Aufschlüsselung der reservierten Kontobeträge

Aktivierung

Einstellungen → „Entwickler-Modus“, mit Warnhinweis zu bestätigen. Danach zeigt ein dauerhafter Badge in der Kopfzeile den aktiven Modus an. Die Wallet schaltet nie von selbst um, und sie schaltet auch nicht auf Zuruf einer Webseite um. Erst mit der Aktivierung wird das Content-Script überhaupt registriert — vorher ist die Wallet für Webseiten schlicht nicht vorhanden. Der Zugriff auf Webseiten ist eine optionale Berechtigung: Der Browser fragt sie genau in dem Moment ab, in dem du den Schalter umlegst, und nicht bei der Installation. Lehnst du ab, funktioniert alles außer dem dApp-Connector weiter.

Zwei Modi, ein Produkt

dApp-Connector

Der in die Seite injizierte Provider liegt unter window.stellarWallet und folgt bewusst der etablierten Freighter-artigen Signatur, damit bestehende Stellar-dApps ohne Anpassung funktionieren. Wir führen keinen neuen Standard ein — Interoperabilität ist hier wichtiger als Eleganz.

isConnected(): Promise<boolean>
Ist die Wallet vorhanden, der Entwickler-Modus aktiv und die Wallet gerade entsperrt? Über die Freigabe deiner Herkunft (Origin) sagt die Methode nichts — dafür ist getPublicKey() da.
getPublicKey(): Promise<string>
Öffentlicher Schlüssel des aktiven Kontos. Erfordert eine Freigabe durch die Nutzerin.
signTransaction(xdr, opts?): Promise<string>
Legt die Transaktion zur Bestätigung vor und liefert die signierte XDR zurück. Ohne Bestätigung kommt USER_REJECTED zurück.
getNetwork(): Promise<{ network, networkPassphrase }>
Aktuell gewähltes Netzwerk als Objekt, nicht als String: network ist die Kennung in Kleinbuchstaben (testnet, futurenet, mainnet, custom), networkPassphrase der Wert, gegen den du bauen solltest.

Codebeispiel

Eine minimale Integration. Fehlerfälle kommen als typisierte Codes zurück, nicht als rohe Ausnahmetexte — so lassen sie sich in der dApp übersetzen.

connect.ts
// Verbinden, Transaktion signieren lassen, Fehler sauber behandeln.
const wallet = window.stellarWallet;

if (!wallet) {
  // Wallet nicht installiert oder Entwickler-Modus nicht aktiv.
  showInstallHint();
  return;
}

try {
  const publicKey = await wallet.getPublicKey();

  // getNetwork() liefert ein Objekt, keinen String.
  const { network, networkPassphrase } = await wallet.getNetwork();
  // network ist z. B. 'testnet', networkPassphrase die zugehoerige Passphrase.

  const xdr = buildPaymentXdr({ from: publicKey, to, amount, networkPassphrase });

  // Die Wallet zeigt eine Klartext-Zusammenfassung und wartet
  // auf die ausdrueckliche Bestaetigung der Nutzerin. Weicht die
  // uebergebene Passphrase vom aktiven Netzwerk ab, warnt der Dialog.
  const signedXdr = await wallet.signTransaction(xdr, { networkPassphrase });

  await submitToHorizon(signedXdr);
} catch (error) {
  switch (error.code) {
    case 'USER_REJECTED':
      // Kein Fehlerdialog noetig - das war eine Entscheidung.
      break;
    case 'WALLET_LOCKED':
      showUnlockHint();
      break;
    case 'NETWORK_ERROR':
      showRetry();
      break;
    default:
      report(error);
  }
}
Codebeispiel: Verbindung aufbauen, Transaktion signieren lassen, Fehlercodes behandeln.

Nachrichtenprotokoll

Zwischen Oberfläche und Hintergrundprozess gibt es genau einen erlaubten Kanal: eine typisierte Nachrichtenschnittstelle, deren Nutzlast schemavalidiert wird. Keine gemeinsamen Objekte, kein direkter Zugriff. Die Methodenfamilien:

wallet

  • wallet.create
  • wallet.importMnemonic
  • wallet.unlock
  • wallet.lock
  • wallet.status

account

  • account.list
  • account.add
  • account.select
  • account.balances
  • account.history

tx

  • tx.build
  • tx.describe
  • tx.sign
  • tx.submit

dapp

nur Entwickler-Modus
  • dapp.requestConnect
  • dapp.signXdr

settings

  • settings.get
  • settings.set

Fehlercodes

  • WALLET_LOCKED — Wallet ist gesperrt, Passwort erforderlich
  • BAD_PASSWORD — Passwort falsch
  • USER_REJECTED — Nutzerin hat abgelehnt
  • NETWORK_ERROR — Endpunkt nicht erreichbar
  • TX_FAILED:<result_code> — Netzwerk hat die Transaktion abgelehnt

Technischer Unterbau

Erweiterung
WXT — eine Codebasis für Chrome MV3 und Firefox MV3
Oberfläche
React 19 mit TypeScript 5 im strict-Modus
Styling
Tailwind CSS v4 mit geteilten Design-Tokens (kein CSS-in-JS wegen MV3-CSP)
Chain-SDK
@stellar/stellar-sdk 16.x — Horizon-Client und Soroban-RPC in einem
State
Zustand für Oberfläche und Einstellungen, TanStack Query für Netzwerkdaten
Kryptografie
WebCrypto AES-256-GCM, Schlüsselableitung mit Argon2id (hash-wasm), Rückfallebene PBKDF2-SHA-512
Tests
Vitest für die Domänenlogik (Krypto, SEP-0005-Ableitung, Transaktionsbeschreibung); ein Playwright-End-to-End-Durchlauf ist geplant, aber noch nicht eingerichtet
Website
Astro 5 und Tailwind v4, statisch, ohne Tracking

Mitmachen

Der Quelltext ist öffentlich. Besonders willkommen sind Beiträge zur Klartext-Übersetzung von Transaktionen, zu Übersetzungen und zu Tests der Kryptografie-Schicht. Die Architekturentscheidungen und Invarianten sind im Architektur-Dokument des Repositorys festgehalten — bitte vorher lesen, sie sind bewusst streng.

Platzhalter Repository-Adresse — von Rene einzutragen

Diese Angabe muss vor der Veröffentlichung ergänzt werden.