Cas d'usage
Explorer
Docs
Tarifs

Organigram Passkey Wallet

L'expérience web3 ultime : déverrouillez vos portefeuilles et signez vos transactions en un clin d'œil, avec des passkeys récupérables.

Organigram Passkey Wallet est un portefeuille Ethereum léger fondé sur les passkeys WebAuthn. Il offre aux utilisateurs l'expérience quotidienne qu'ils attendent des applications modernes sans mot de passe, tout en préservant la propriété essentielle du web3 : posséder pleinement et en toute sécurité une adresse Ethereum standard.

Pas de déploiement fastidieux de smart account. Pas de création de compte réseau par réseau. Pas de service de garde des clés. Pas d'enfermement dans un protocole. Simplement un EOA standard, chiffré côté client, déverrouillé par des passkeys renouvelables et exposé via Wagmi et RainbowKit.


pnpm add @organigram/passkey-wallet

L'identité web3, enfin résolue

La plupart des parcours d'accueil web3 demandent encore aux utilisateurs de comprendre les extensions de navigateur, les phrases de récupération, les appareils matériels, l'abstraction de compte, le sponsoring du gas, les contrats de récupération, les déploiements propres à chaque réseau, les permissions des signataires... avant même d'avoir utilisé le produit. Organigram Passkey Wallet emprunte un chemin plus simple.

L'utilisateur crée un portefeuille dans le navigateur. Ce portefeuille est un EOA Ethereum ordinaire dérivé d'une phrase de récupération. Cette phrase est chiffrée localement avec une clé dérivée de la sortie PRF d'une passkey WebAuthn, puis stockée uniquement sous forme d'enveloppe de coffre chiffrée. Quand l'utilisateur revient, sa passkey déverrouille le coffre et l'EOA signe messages et transactions comme n'importe quel autre portefeuille.

Le résultat est une expérience de portefeuille qui semble native au web :

  • les utilisateurs déverrouillent et signent avec des passkeys ;
  • plusieurs passkeys de secours peuvent être ajoutées à la même adresse ;
  • les passkeys compromises ou obsolètes peuvent être renouvelées ;
  • les phrases de récupération peuvent être exportées en prévision d'un sinistre ;
  • les coffres de sauvegarde chiffrés peuvent être enregistrés à distance ou localement ;
  • une seule adresse sur tous les réseaux EVM ;
  • la sémantique EIP-1193 standard pour les dapps ;
  • aucun déploiement on-chain nécessaire ;
  • aucun relais de signature off-chain ni signataire hébergé à qui faire confiance.

Points forts

Déverrouiller et signer avec des passkeys

Les utilisateurs déverrouillent le portefeuille avec une passkey WebAuthn. Une fois déverrouillé, le portefeuille signe messages, données typées et transactions avec l'EOA sous-jacent.

Un portefeuille Ethereum à part entière

Le portefeuille expose la même interface que celle que les dapps attendent déjà des portefeuilles injectés, des portefeuilles WalletConnect et des connecteurs RainbowKit. Il prend en charge les demandes de compte, le changement de chaîne, la signature de messages et de données typées, et l'envoi de transactions, comme tout portefeuille standard.

Plusieurs clés de secours, une seule adresse

Les utilisateurs peuvent ajouter d'autres passkeys pour la même adresse. Un téléphone de secours, un ordinateur portable, un gestionnaire de mots de passe ou une clé de sécurité peuvent déverrouiller le même coffre chiffré.

Aucun smart account à déployer

L'adresse est un EOA standard : elle existe partout où existent des comptes EVM. Inutile de déployer des contrats de compte sur chaque réseau avant que l'utilisateur puisse commencer.

Export de la phrase de récupération

Les passkeys simplifient l'usage quotidien, tandis que la possibilité d'exporter la phrase de récupération préserve la portabilité et donne aux utilisateurs une issue de secours au cas où toutes leurs passkeys seraient perdues.

Coffres récupérables

L'application exporte un coffre chiffré qui peut être enregistré et restauré depuis n'importe où. Utilisez des serveurs distants, enregistrez-le localement ou dans un gestionnaire de mots de passe sans crainte de divulguer d'informations sensibles.

Interface du portefeuille

Ce paquet construit une application prête pour la production, qui sert le portefeuille en local ou sur des domaines personnalisés.


pnpm dev
pnpm build:artifact

build:artifact compile la bibliothèque TypeScript dans app-dist, et emballe une archive déterministe artifacts/passkey-wallet-app-v<version>.tar.gz avec un .sha256 de contrôle et un manifeste.

Développement local

pnpm dev sert le portefeuille à l'adresse https://localhost:3002, derrière un proxy HTTPS placé devant Vite (port 3003). Le premier lancement crée un certificat local avec mkcert.

Tout autre nom d'hôte peut être passé en argument (pnpm dev my.host.test) : le certificat est alors régénéré pour l'inclure.

Exécuter votre propre portefeuille

Vous n'avez pas à faire confiance aux serveurs de wallet.organigram.ai, ni au code qu'ils servent, pour utiliser vos comptes Organigram. Le profil local-organigram sert votre propre copie du portefeuille, construite à partir de ce code source, sur votre machine :


pnpm dev local-organigram

(ou pnpm passkey-wallet dev local-organigram depuis la racine du dépôt), puis ouvrez https://local.wallet.organigram.ai:3002.

local.wallet.organigram.ai est un sous-domaine de wallet.organigram.ai, donc cette copie déverrouille les mêmes passkeys, et donc les mêmes comptes : le profil fixe le RP ID des passkeys à wallet.organigram.ai. Son stockage navigateur est distinct : restaurez-y donc une fois votre coffre chiffré (voir Coffres récupérables) ; votre passkey le déverrouille ensuite comme d'habitude. Vos clés ne quittent jamais votre navigateur, et la connexion ne dépend plus de la disponibilité ni de l'intégrité de wallet.organigram.ai.

Le nom pointe déjà vers 127.0.0.1 via le DNS public, aucune configuration n'est donc nécessaire. Pour une garantie plus forte, déclarez-le aussi dans votre fichier hosts : sinon, un enregistrement DNS falsifié pourrait le rediriger vers un serveur capable de demander la sortie PRF de vos passkeys (macOS et Linux) :


grep -q 'local.wallet.organigram.ai' /etc/hosts || echo '127.0.0.1 local.wallet.organigram.ai' | sudo tee -a /etc/hosts

Pour l'utiliser depuis n'importe quelle application, activez Paramètres → Votre propre portefeuille sur wallet.organigram.ai. Les requêtes vont alors vers votre copie et, dès qu'elle a répondu, les applications l'ouvrent directement : wallet.organigram.ai n'est plus chargé du tout. Si votre copie cesse de répondre, par exemple parce qu'elle n'est pas lancée, la requête revient vers wallet.organigram.ai au bout de quelques secondes.

Les applications qui utilisent ce paquet acceptent la copie locale du portefeuille officiel sans aucun réglage, sur leurs pages comme sur leurs points d'accès au portefeuille (défi de connexion, sauvegardes de coffres, RPC).

Un portefeuille déployé ailleurs peut offrir la même chose à ses utilisateurs avec sa propre copie locale, servie sous un sous-domaine de son hôte afin qu'elle déverrouille les mêmes passkeys :

  • le déploiement la déclare avec localWalletOrigin dans passkey-wallet.config.json (ou PASSKEY_WALLET_LOCAL_WALLET_ORIGIN au moment du build), par exemple https://local.wallet.example.com:3002;
  • les utilisateurs la lancent avec PASSKEY_WALLET_PASSKEY_RP_ID=wallet.example.com pnpm dev local.wallet.example.com;
  • les applications l'acceptent avec NEXT_PUBLIC_ORGANIGRAM_PASSKEY_WALLET_LOCAL_URL, à côté de NEXT_PUBLIC_ORGANIGRAM_PASSKEY_WALLET_URL. La valeur est ignorée si ce n'est pas un sous-domaine HTTPS de l'hôte du portefeuille.

Chaque build de production de https://wallet.organigram.ai est publié comme release de ce dépôt, avec le SHA-256 de chaque fichier servi. Pour vérifier que le portefeuille en ligne sert l'une de ces releases sans modification, lancez depuis un clone de ce dépôt :


node scripts/verify-runtime-dist.mjs --url https://wallet.organigram.ai

Avec Node.js 24 et pnpm 10.28, reconstruire le commit d'une release reproduit ses fichiers :


pnpm install --frozen-lockfile
pnpm run build
node scripts/verify-runtime-dist.mjs --dist app-dist --manifest <release manifest>

Architecture


Browser
WebAuthn passkey with PRF
|
v
HKDF-derived vault key
|
v
AES-GCM encrypted wallet vault envelope
|
v
Recovery phrase -> EOA -> EIP-1193 provider
Server
WebAuthn challenges
Credential public keys
Credential counters
Encrypted vault envelopes

En pratique, le déroulement est le suivant :

  1. Générer une phrase de récupération dans le navigateur.
  2. Dériver de cette phrase un EOA Ethereum standard.
  3. Créer une passkey WebAuthn avec residentKey: "required", userVerification: "required", et l'extension prf .
  4. Dériver une clé de chiffrement du coffre à partir de la sortie PRF et d'un sel aléatoire.
  5. Chiffrer le coffre du portefeuille avec AES-GCM.
  6. Ne stocker côté serveur que les métadonnées de l'identifiant et l'enveloppe chiffrée du coffre.
  7. Au déverrouillage, vérifier WebAuthn, récupérer la sortie PRF, déchiffrer l'enveloppe et exposer l'EOA via EIP-1193.

Les secrets du portefeuille sont générés et déchiffrés dans le navigateur. Le serveur ne stocke que les éléments de vérification WebAuthn et les enveloppes chiffrées des coffres. Il n'a jamais besoin de la phrase de récupération, de la clé privée ni du coffre déchiffré de l'utilisateur.

Démarrage rapide

Créez et déverrouillez des coffres dans l'interface avec les fonctions du portefeuille :


import {
createGeneratedRecoveryPhrase,
registerBrowserPasskeyVault,
unlockBrowserPasskeyVault
} from '@organigram/passkey-wallet/browser-wallet'
const registration = await registerBrowserPasskeyVault({
recoveryPhrase: createGeneratedRecoveryPhrase(),
name: 'Account 1'
})
const unlocked = await unlockBrowserPasskeyVault({
records: [registration.record]
})
const signature = await unlocked.wallet.account.signMessage({
message: 'gm'
})

La cérémonie de passkey et le déchiffrement du coffre ont lieu sur l'origine du portefeuille. Les dapps doivent s'intégrer via le connecteur distant.

Intégration RainbowKit


import { connectorsForWallets } from '@rainbow-me/rainbowkit'
import { createConfig, http } from 'wagmi'
import { mainnet, sepolia } from 'wagmi/chains'
import {
createOrganigramRemotePasskeyWallet
} from '@organigram/passkey-wallet/remote-rainbowkit'
const passkeyWallet = createOrganigramRemotePasskeyWallet({
walletOrigin: 'https://wallet.organigram.ai'
})
export const wagmiConfig = createConfig({
chains: [mainnet, sepolia],
connectors: connectorsForWallets(
[
{
groupName: 'Recommended',
wallets: [() => passkeyWallet]
}
],
{
appName: 'Your App',
projectId: 'walletconnect-project-id'
}
),
transports: {
[mainnet.id]: http(),
[sepolia.id]: http()
}
})

Du point de vue de la dapp, il se comporte comme un portefeuille. Un appel à personal_sign, eth_signTypedData_v4, ou eth_sendTransaction passe par l'origine du portefeuille, où l'utilisateur approuve la requête.

Rôle du serveur

L'application du portefeuille est statique. Un serveur est facultatif et ne doit recevoir que des sauvegardes chiffrées ou des défis de connexion des dapps. Il ne doit ni créer d'identifiants WebAuthn, ni déverrouiller de coffres, ni recevoir de secrets déchiffrés du portefeuille.

Clés de secours et renouvellement

Un portefeuille à passkeys ne doit jamais dépendre d'un seul authentificateur.

Organigram Passkey Wallet permet d'ajouter une autre passkey au même portefeuille en rechiffrant le même contenu de coffre pour un nouvel identifiant. L'adresse ne change pas. L'utilisateur garde le même EOA tout en ajoutant une passkey d'ordinateur, de téléphone, de gestionnaire de mots de passe ou une clé de sécurité matérielle.

Le renouvellement suit la même idée à l'inverse : ne retirer les identifiants obsolètes que s'il reste une autre méthode de récupération. Le paquet fournit les briques du portefeuille et des enveloppes ; c'est à votre produit de définir la politique d'expérience utilisateur pour la suppression, la confirmation et le nombre minimal de sauvegardes.

Récupération

Les passkeys simplifient l'usage quotidien du portefeuille, mais les utilisateurs ont toujours besoin d'une issue de secours.

Organigram Passkey Wallet garde le portefeuille portable en dérivant l'EOA d'une phrase de récupération standard. Si toutes les passkeys sont perdues, l'utilisateur peut récupérer le compte avec cette phrase, ou l'utiliser dans n'importe quel autre portefeuille.

La phrase de récupération doit toujours être exportée avant que l'utilisateur perde toutes ses passkeys. Le paquet fournit une fonction pour exporter la phrase de récupération après une cérémonie WebAuthn réussie, mais ne peut plus le faire une fois tout accès au coffre perdu.

Modèle de sécurité

Organigram Passkey Wallet est non custodial par conception.

Le navigateur crée le portefeuille. Le navigateur chiffre le coffre. Le navigateur déchiffre le coffre après une cérémonie WebAuthn réussie. Le serveur stocke les enveloppes chiffrées et vérifie que les réponses WebAuthn sont valides pour le défi, l'origine, le RP ID et la clé publique d'identifiant attendus.

Ce modèle suppose que :

  • la prise en charge de WebAuthn PRF est requise pour le coffre à passkeys ;
  • l'application hôte sert l'interface du portefeuille depuis une origine de confiance ;
  • le serveur fait correctement expirer et consomme les défis ;
  • le serveur vérifie les compteurs d'identifiants et la vérification de l'utilisateur ;
  • l'export de la phrase de récupération est traité comme une opération sensible ;
  • la suppression d'une passkey de secours ne laisse jamais l'utilisateur sans méthode de récupération ;
  • une session de navigateur compromise peut lire les secrets déverrouillés du portefeuille pendant le traitement d'une requête.

Portée des passkeys

Les passkeys sont créées pour le nom d'hôte exact qui sert le portefeuille (par exemple wallet.organigram.ai). Toute page servie sous le RP ID des passkeys peut demander la sortie PRF qui déchiffre le coffre : aucune autre application ne doit donc y être hébergée. Les dapps n'ont jamais besoin du RP ID du portefeuille : elles l'atteignent via sa fenêtre popup et postMessage.

Un portefeuille servi depuis un sous-domaine peut réutiliser les passkeys de l'hôte parent en réglant passkeyRpId dans passkey-wallet.config.json (ou PASSKEY_WALLET_PASSKEY_RP_ID) sur cet hôte. La valeur doit être le nom d'hôte courant ou l'un de ses domaines parents. pnpm dev local-organigram le fait pour wallet.organigram.ai (voir Exécuter votre propre portefeuille).

Le portefeuille envoie une Content-Security-Policy qui interdit les scripts tiers et toute intégration de l'origine du portefeuille dans un cadre.

Compatibilité des navigateurs

Le coffre à passkeys dépend de l'extension WebAuthn prf . Les navigateurs ou gestionnaires de mots de passe qui ne renvoient pas de sortie PRF ne peuvent pas déverrouiller le coffre chiffré.

Les applications doivent proposer une solution de repli claire quand PRF n'est pas disponible :

  • réessayer avec un autre fournisseur de passkeys ;
  • utiliser un authentificateur de plateforme qui prend en charge PRF ;
  • connecter plutôt un portefeuille crypto externe.

Ce que ce n'est pas

Organigram Passkey Wallet n'est pas un framework de smart accounts. Il ne nécessite ni infrastructure 4337, ni paymasters, ni bundlers, ni registres de modules, ni déploiements par chaîne.

Ce n'est pas un portefeuille custodial. Le serveur ne reçoit jamais la phrase de récupération ni la clé privée en clair.

Ce n'est pas un service de portefeuille hébergé. Le paquet est open source ; l'application hôte gère la persistance, l'authentification et la politique de sauvegarde.

Il ne remplace pas les portefeuilles matériels pour les conservations exigeant un haut niveau de garantie. Il est conçu pour offrir l'expérience web grand public la plus sûre possible, tout en restant portable et compatible EVM.

Licence

MIT

Connecter une application

Les applications atteignent le portefeuille via createOrganigramRemotePasskeyWallet(), un portefeuille RainbowKit dont le connecteur wagmi ouvre le portefeuille dans une fenêtre popup. Chaque connexion, signature, transaction ou opération de chiffrement est une requête que l'utilisateur approuve dans la popup. Les applications échangent requêtes et réponses avec la popup via postMessage, et n'acceptent que les réponses provenant de l'origine du portefeuille et de sa copie locale. Les signatures sont vérifiées par rapport à l'adresse et à la chaîne connectées avant d'atteindre l'application. Les clés privées ne quittent jamais l'origine du portefeuille.

CreateOrganigramRemotePasskeyWalletInput

Entrée de createOrganigramRemotePasskeyWallet().

Definition

export type CreateOrganigramRemotePasskeyWalletInput = {
walletOrigin?: string;
requestConnect?: RemoteRequestConnect;
requestPersonalSign?: RemoteRequestPersonalSign;
requestSignTypedData?: RemoteRequestSignTypedData;
requestSendTransaction?: RemoteRequestSendTransaction;
};

HydrateOrganigramRemoteWalletConnectionConnector

Un connecteur wagmi, identifié par son id.

Definition

export type HydrateOrganigramRemoteWalletConnectionConnector = {
id: string;
};

HydrateOrganigramRemoteWalletConnectionInput

Une adresse déjà connue de l'application, par exemple par sa session.

Definition

export type HydrateOrganigramRemoteWalletConnectionInput = {
address: `0x${string}`;
chainId?: number;
};

HydrateOrganigramRemoteWalletConnectionOptions

Entrée de hydrateOrganigramRemoteWalletConnection().

Definition

export type HydrateOrganigramRemoteWalletConnectionOptions<TConnector extends HydrateOrganigramRemoteWalletConnectionConnector> = HydrateOrganigramRemoteWalletConnectionInput & {
connectors: readonly TConnector[];
connectAsync: (input: {
connector: TConnector;
}) => Promise<unknown>;
defaultChainId?: number;
};

OrganigramRemotePasskeyWalletConnection

Une connexion au portefeuille mémorisée dans le stockage local de l'application.

Elle ne contient que l'adresse publique et la chaîne, jamais de clé : chaque signature est toujours demandée à l'utilisateur dans la popup du portefeuille.

Definition

export type OrganigramRemotePasskeyWalletConnection = {
version: 1;
address: `0x${string}`;
chainId: number;
connectedAt: string;
};

beginOrganigramWalletApprovalSequence

Ajoute un contexte purement informatif aux prochaines approbations du portefeuille. Une application peut ainsi indiquer au portefeuille qu'une même action de l'utilisateur nécessite plusieurs signatures, sans élargir aucune approbation ni modifier son contenu signé.

Signature

beginOrganigramWalletApprovalSequence: (input: {
count: number;
label?: string;
}) => (() => void)

clearOrganigramRemotePasskeyWalletConnection

Oublier la connexion mémorisée au portefeuille.

Signature

clearOrganigramRemotePasskeyWalletConnection: () => void

createOrganigramRemotePasskeyWallet

Créer le portefeuille RainbowKit du passkey wallet, qui ouvre le portefeuille dans une popup.

Le connecteur expose un fournisseur EIP-1193. Les demandes de compte et de signature ouvrent la popup du portefeuille, et chaque signature est vérifiée par rapport à l'adresse et à la chaîne connectées. Les autres requêtes JSON-RPC vont à l'URL RPC par défaut de la chaîne active.


const connectors = connectorsForWallets(
[{ groupName: 'Organigram', wallets: [() => createOrganigramRemotePasskeyWallet()] }],
{ appName: 'My app', projectId }
)

Signature

createOrganigramRemotePasskeyWallet: (input?: CreateOrganigramRemotePasskeyWalletInput) => Wallet

Paramètres

NomTypeDescription
inputCreateOrganigramRemotePasskeyWalletInputL'origine du portefeuille, et les remplacements de ses requêtes.

getOrganigramRemotePasskeyWalletConnection

Lire la connexion mémorisée au portefeuille.

Signature

getOrganigramRemotePasskeyWalletConnection: () => OrganigramRemotePasskeyWalletConnection | null

Retourne

TypeDescription
OrganigramRemotePasskeyWalletConnection | nullLa connexion, ou null si aucune n'est valide.

hydrateOrganigramRemoteWalletConnection

Connecter wagmi au portefeuille pour une adresse que l'application connaît déjà, sans ouvrir la popup du portefeuille.

Mémorise la connexion, puis connecte le connecteur du portefeuille, qui la restaure. Si la connexion échoue, elle est oubliée.

Signature

hydrateOrganigramRemoteWalletConnection: <TConnector extends HydrateOrganigramRemoteWalletConnectionConnector>(input: HydrateOrganigramRemoteWalletConnectionOptions<TConnector>) => Promise<void>

rememberOrganigramRemotePasskeyWalletConnection

Mémoriser une connexion au portefeuille dans le stockage local.

Signature

rememberOrganigramRemotePasskeyWalletConnection: (input: {
address: `0x${string}`;
chainId: number;
}) => void

Paramètres

NomTypeDescription
input{ address: `0x${string}`; chainId: number; }L'adresse et la chaîne connectées.

organigramRemotePasskeyWalletId

Identifiant du connecteur wagmi du portefeuille, organigramPasskeyWalletId.

Definition

const organigramRemotePasskeyWalletId = "organigram-passkeys"

PasskeyWalletConnectPopupInput

Entrée de requestPasskeyWalletConnect().

Definition

export type PasskeyWalletConnectPopupInput = PasskeyWalletRemotePopupInput;

PasskeyWalletConnectRequest

Une requête pour connecter une application au portefeuille, qui répond avec l'adresse choisie.

Definition

export type PasskeyWalletConnectRequest = PasskeyWalletRemoteRequestBase & {
type: typeof passkeyWalletConnectType;
};

PasskeyWalletConnectResult

La réponse à une requête de connexion, avec l'adresse choisie par l'utilisateur.

Definition

export type PasskeyWalletConnectResult = PasskeyWalletRemoteResultBase & {
type: typeof passkeyWalletConnectResultType;
};

PasskeyWalletDecryptPayloadRequest

Une requête pour déchiffrer un texte chiffré pour l'origine de l'application.

Definition

export type PasskeyWalletDecryptPayloadRequest = PasskeyWalletRemoteRequestBase & {
type: typeof passkeyWalletDecryptPayloadType;
address: `0x${string}`;
encryptedPayload: WalletEncryptedPayload;
};

PasskeyWalletDecryptPayloadResult

La réponse à une requête de déchiffrement.

Definition

export type PasskeyWalletDecryptPayloadResult = PasskeyWalletRemoteResultBase & {
type: typeof passkeyWalletDecryptPayloadResultType;
plaintext: string;
};

PasskeyWalletEncryptPayloadRequest

Une requête pour chiffrer un texte avec la clé de chiffrement du portefeuille, pour l'origine de l'application.

Definition

export type PasskeyWalletEncryptPayloadRequest = PasskeyWalletRemoteRequestBase & {
type: typeof passkeyWalletEncryptPayloadType;
address: `0x${string}`;
plaintext: string;
};

PasskeyWalletEncryptPayloadResult

La réponse à une requête de chiffrement.

Definition

export type PasskeyWalletEncryptPayloadResult = PasskeyWalletRemoteResultBase & {
type: typeof passkeyWalletEncryptPayloadResultType;
encryptedPayload: WalletEncryptedPayload;
};

PasskeyWalletRemoteErrorResult

La réponse à une requête que le portefeuille n'a pas pu traiter.

Definition

export type PasskeyWalletRemoteErrorResult = Omit<PasskeyWalletRemoteResultBase, 'address'> & {
type: typeof passkeyWalletRemoteErrorResultType;
address?: undefined;
error: string;
};

PasskeyWalletRemotePopupInput

Entrée commune des requêtes adressées à la popup du portefeuille.

Definition

export type PasskeyWalletRemotePopupInput = {
walletOrigin?: string;
appOrigin?: string;
chainId: number;
requestId?: string;
requestedAt?: string;
approvalStep?: number;
approvalCount?: number;
approvalLabel?: string;
};

PasskeyWalletRemoteRequest

Une requête qu'une application peut envoyer au portefeuille.

Definition

export type PasskeyWalletRemoteRequest = PasskeyWalletConnectRequest | PasskeyWalletSignMessageRequest | PasskeyWalletSignTypedDataRequest | PasskeyWalletSendTransactionRequest | PasskeyWalletEncryptPayloadRequest | PasskeyWalletDecryptPayloadRequest;

PasskeyWalletRemoteRequestPayloadMessage

Le message par lequel une application transmet une requête à la popup du portefeuille.

Definition

export type PasskeyWalletRemoteRequestPayloadMessage = {
type: typeof passkeyWalletRemoteRequestPayloadType;
version: 1;
request: PasskeyWalletRemoteRequest;
};

PasskeyWalletRemoteRequestType

Types des requêtes qu'une application peut envoyer au portefeuille.

Definition

export type PasskeyWalletRemoteRequestType = typeof passkeyWalletConnectType | typeof passkeyWalletSignMessageType | typeof passkeyWalletSignTypedDataType | typeof passkeyWalletSendTransactionType | typeof passkeyWalletEncryptPayloadType | typeof passkeyWalletDecryptPayloadType;

PasskeyWalletRemoteResult

Une réponse du portefeuille à une requête.

Definition

export type PasskeyWalletRemoteResult = PasskeyWalletConnectResult | PasskeyWalletSignMessageResult | PasskeyWalletSignTypedDataResult | PasskeyWalletSendTransactionResult | PasskeyWalletEncryptPayloadResult | PasskeyWalletDecryptPayloadResult | PasskeyWalletRemoteErrorResult;

PasskeyWalletSendTransactionRequest

Une requête pour signer et envoyer une transaction.

Definition

export type PasskeyWalletSendTransactionRequest = PasskeyWalletRemoteRequestBase & {
type: typeof passkeyWalletSendTransactionType;
address: `0x${string}`;
transaction: PasskeyWalletTransaction;
};

PasskeyWalletSendTransactionResult

La réponse à une requête d'envoi de transaction.

Definition

export type PasskeyWalletSendTransactionResult = PasskeyWalletRemoteResultBase & {
type: typeof passkeyWalletSendTransactionResultType;
transactionHash: `0x${string}`;
};

PasskeyWalletSignMessagePopupInput

Entrée de requestPasskeyWalletSignMessage().

Definition

export type PasskeyWalletSignMessagePopupInput = PasskeyWalletRemotePopupInput & {
address: `0x${string}`;
message: string;
};

PasskeyWalletSignMessageRequest

Une requête pour signer un message avec EIP-191 personal_sign.

Definition

export type PasskeyWalletSignMessageRequest = PasskeyWalletRemoteRequestBase & {
type: typeof passkeyWalletSignMessageType;
address: `0x${string}`;
message: string;
};

PasskeyWalletSignMessageResult

La réponse à une requête de signature de message.

Definition

export type PasskeyWalletSignMessageResult = PasskeyWalletRemoteResultBase & {
type: typeof passkeyWalletSignMessageResultType;
message: string;
signature: `0x${string}`;
};

PasskeyWalletSignTypedDataPopupInput

Entrée d'une requête de signature de données typées.

Definition

export type PasskeyWalletSignTypedDataPopupInput = PasskeyWalletRemotePopupInput & {
address: `0x${string}`;
typedData: PasskeyWalletTypedData;
};

PasskeyWalletSignTypedDataRequest

Une requête pour signer des données typées EIP-712.

Definition

export type PasskeyWalletSignTypedDataRequest = PasskeyWalletRemoteRequestBase & {
type: typeof passkeyWalletSignTypedDataType;
address: `0x${string}`;
typedData: PasskeyWalletTypedData;
};

PasskeyWalletSignTypedDataResult

La réponse à une requête de signature de données typées.

Definition

export type PasskeyWalletSignTypedDataResult = PasskeyWalletRemoteResultBase & {
type: typeof passkeyWalletSignTypedDataResultType;
typedData: PasskeyWalletTypedData;
signature: `0x${string}`;
};

PasskeyWalletTransaction

Une transaction à envoyer, avec des quantités en hexadécimal.

Definition

export type PasskeyWalletTransaction = {
from: `0x${string}`;
to: `0x${string}`;
data?: `0x${string}`;
value?: `0x${string}`;
gas?: `0x${string}`;
gasPrice?: `0x${string}`;
maxFeePerGas?: `0x${string}`;
maxPriorityFeePerGas?: `0x${string}`;
nonce?: `0x${string}`;
};

PasskeyWalletTypedData

Données typées EIP-712.

Definition

export type PasskeyWalletTypedData = {
domain: Record<string, unknown>;
types: Record<string, ReadonlyArray<{
name: string;
type: string;
}>>;
primaryType: string;
message: Record<string, unknown>;
};

assertPasskeyWalletSignMessageResult

Vérifier qu'un message signé provient de l'adresse et de la chaîne attendues.

Retrouve le signataire à partir de la signature, afin qu'une réponse falsifiée soit rejetée. Cela ne fonctionne que pour les signatures d'EOA, que produit le portefeuille.

Signature

assertPasskeyWalletSignMessageResult: (input: {
result: PasskeyWalletSignMessageResult;
address: `0x${string}`;
chainId: number;
message: string;
}) => Promise<void>

Paramètres

NomTypeDescription
input{ result: PasskeyWalletSignMessageResult; address: `0x${string}`; chainId: number; message: string; }La réponse, et l'adresse, la chaîne et le message de la requête.

assertPasskeyWalletSignTypedDataResult

Vérifier que des données typées signées proviennent de l'adresse et de la chaîne attendues.

Retrouve le signataire à partir de la signature, afin qu'une réponse falsifiée soit rejetée.

Signature

assertPasskeyWalletSignTypedDataResult: (input: {
result: PasskeyWalletSignTypedDataResult;
address: `0x${string}`;
chainId: number;
typedData: PasskeyWalletTypedData;
}) => Promise<void>

Paramètres

NomTypeDescription
input{ result: PasskeyWalletSignTypedDataResult; address: `0x${string}`; chainId: number; typedData: PasskeyWalletTypedData; }La réponse, et l'adresse, la chaîne et les données typées de la requête.

buildPasskeyWalletRemotePopupUrl

Construire l'URL de la popup du portefeuille pour une requête.

Toute requête autre que la connexion est ensuite transmise par postMessage. Le portefeuille lit l'origine demandeuse dans le MessageEvent authentifié par le navigateur, au lieu de faire confiance au appOrigin écrit dans l'URL, et aucun message, aucune transaction ni aucun secret ne se retrouve dans une URL.

Signature

buildPasskeyWalletRemotePopupUrl: (input: PasskeyWalletRemotePopupInput & {
type: PasskeyWalletRemoteRequestType;
address?: `0x${string}`;
}) => URL

Paramètres

NomTypeDescription
inputPasskeyWalletRemotePopupInput & { type: PasskeyWalletRemoteRequestType; address?: `0x${string}`; }La requête, avec son type et son adresse.

isPasskeyWalletRemoteRequestPayloadMessage

Vérifier qu'un message transmis est une requête valide au portefeuille.

Le domaine de la requête doit être l'hôte de son appOrigin. Le portefeuille doit encore comparer appOrigin à l'origine du MessageEvent, que le navigateur authentifie.

Signature

isPasskeyWalletRemoteRequestPayloadMessage: (value: unknown, expectedRequestId?: string) => value is PasskeyWalletRemoteRequestPayloadMessage

Paramètres

NomTypeDescription
valueunknownLes données du message.
expectedRequestIdstringL'identifiant de la requête attendue, s'il est connu.

isPasskeyWalletTransaction

Vérifier qu'une valeur est une transaction avec des adresses valides et des quantités hexadécimales.

Signature

isPasskeyWalletTransaction: (value: unknown) => value is PasskeyWalletTransaction

Paramètres

NomTypeDescription
valueunknownLa valeur à vérifier.

parsePasskeyWalletRemoteRequest

Lire et vérifier une requête à partir des paramètres d'URL de la popup du portefeuille.

Rejette les requêtes de chiffrement et de déchiffrement, qui doivent être transmises par postMessage, ainsi que les requêtes dont le domaine n'est pas l'hôte de leur appOrigin.

Signature

parsePasskeyWalletRemoteRequest: (params: URLSearchParams) => PasskeyWalletRemoteRequest

Paramètres

NomTypeDescription
paramsURLSearchParamsLes paramètres d'URL.

parsePasskeyWalletTypedData

Lire des données typées.

Signature

parsePasskeyWalletTypedData: (value: unknown) => PasskeyWalletTypedData

Paramètres

NomTypeDescription
valueunknownLes données typées, ou leur JSON.

requestPasskeyWalletConnect

Demander au portefeuille, dans une popup, de connecter l'application.

Signature

requestPasskeyWalletConnect: (input: PasskeyWalletConnectPopupInput & {
timeoutMs?: number;
}) => Promise<PasskeyWalletConnectResult>

Paramètres

NomTypeDescription
inputPasskeyWalletConnectPopupInput & { timeoutMs?: number; }La requête, et un délai d'expiration, 5 minutes par défaut.

Retourne

TypeDescription
Promise<PasskeyWalletConnectResult>La réponse, avec l'adresse choisie par l'utilisateur.

requestPasskeyWalletDecryptPayload

Demander au portefeuille, dans une popup, de déchiffrer un texte chiffré pour l'origine de l'application.

Signature

requestPasskeyWalletDecryptPayload: (input: PasskeyWalletRemotePopupInput & {
address: `0x${string}`;
encryptedPayload: WalletEncryptedPayload;
timeoutMs?: number;
}) => Promise<PasskeyWalletDecryptPayloadResult>

Paramètres

NomTypeDescription
inputPasskeyWalletRemotePopupInput & { address: `0x${string}`; encryptedPayload: WalletEncryptedPayload; timeoutMs?: number; }La requête, l'adresse, le contenu chiffré et un délai d'expiration, 5 minutes par défaut.

Retourne

TypeDescription
Promise<PasskeyWalletDecryptPayloadResult>La réponse, avec le texte déchiffré.

requestPasskeyWalletEncryptPayload

Demander au portefeuille, dans une popup, de chiffrer un texte pour l'origine de l'application.

Signature

requestPasskeyWalletEncryptPayload: (input: PasskeyWalletRemotePopupInput & {
address: `0x${string}`;
plaintext: string;
timeoutMs?: number;
}) => Promise<PasskeyWalletEncryptPayloadResult>

Paramètres

NomTypeDescription
inputPasskeyWalletRemotePopupInput & { address: `0x${string}`; plaintext: string; timeoutMs?: number; }La requête, l'adresse, le texte et un délai d'expiration, 5 minutes par défaut.

Retourne

TypeDescription
Promise<PasskeyWalletEncryptPayloadResult>La réponse, avec le contenu chiffré.

requestPasskeyWalletSignMessage

Demander au portefeuille, dans une popup, de signer un message.

La réponse est vérifiée avec assertPasskeyWalletSignMessageResult().

Signature

requestPasskeyWalletSignMessage: (input: PasskeyWalletSignMessagePopupInput & {
timeoutMs?: number;
}) => Promise<PasskeyWalletSignMessageResult>

Paramètres

NomTypeDescription
inputPasskeyWalletSignMessagePopupInput & { timeoutMs?: number; }La requête, l'adresse, le message et un délai d'expiration, 5 minutes par défaut.

Retourne

TypeDescription
Promise<PasskeyWalletSignMessageResult>La réponse, avec la signature.

stringifyPasskeyWalletTypedData

Sérialiser des données typées en JSON, en écrivant les bigints sous forme de chaînes décimales.

Signature

stringifyPasskeyWalletTypedData: (typedData: PasskeyWalletTypedData) => string

Paramètres

NomTypeDescription
typedDataPasskeyWalletTypedDataLes données typées.

passkeyWalletConnectResultType

Type de la réponse à une requête de connexion.

Definition

const passkeyWalletConnectResultType = "organigram:wallet:connect-result"

passkeyWalletConnectType

Type d'une requête pour connecter une application au portefeuille.

Definition

const passkeyWalletConnectType = "organigram:wallet:connect"

passkeyWalletDecryptPayloadResultType

Type de la réponse à une requête de déchiffrement.

Definition

const passkeyWalletDecryptPayloadResultType = "organigram:wallet:decrypt-payload-result"

passkeyWalletDecryptPayloadType

Type d'une requête pour déchiffrer un texte avec la clé de chiffrement du portefeuille.

Definition

const passkeyWalletDecryptPayloadType = "organigram:wallet:decrypt-payload"

passkeyWalletEncryptPayloadResultType

Type de la réponse à une requête de chiffrement.

Definition

const passkeyWalletEncryptPayloadResultType = "organigram:wallet:encrypt-payload-result"

passkeyWalletEncryptPayloadType

Type d'une requête pour chiffrer un texte avec la clé de chiffrement du portefeuille.

Definition

const passkeyWalletEncryptPayloadType = "organigram:wallet:encrypt-payload"

passkeyWalletRemoteErrorResultType

Type de la réponse à une requête que le portefeuille n'a pas pu traiter.

Definition

const passkeyWalletRemoteErrorResultType = "organigram:wallet:remote-error"

passkeyWalletRemoteRequestPayloadType

Type du message par lequel une application transmet une requête à la popup du portefeuille.

Definition

const passkeyWalletRemoteRequestPayloadType = "organigram:wallet:request-payload"

passkeyWalletSendTransactionResultType

Type de la réponse à une requête d'envoi de transaction.

Definition

const passkeyWalletSendTransactionResultType = "organigram:wallet:send-transaction-result"

passkeyWalletSendTransactionType

Type d'une requête d'envoi de transaction.

Definition

const passkeyWalletSendTransactionType = "organigram:wallet:send-transaction"

passkeyWalletSignMessageResultType

Type de la réponse à une requête de signature de message.

Definition

const passkeyWalletSignMessageResultType = "organigram:wallet:sign-message-result"

passkeyWalletSignMessageType

Type d'une requête de signature de message.

Definition

const passkeyWalletSignMessageType = "organigram:wallet:sign-message"

passkeyWalletSignTypedDataResultType

Type de la réponse à une requête de signature de données typées.

Definition

const passkeyWalletSignTypedDataResultType = "organigram:wallet:sign-typed-data-result"

passkeyWalletSignTypedDataType

Type d'une requête de signature de données typées EIP-712.

Definition

const passkeyWalletSignTypedDataType = "organigram:wallet:sign-typed-data"

getAcceptedWalletOrigins

Les origines dont une application qui attend walletOrigin accepte les messages.

Signature

getAcceptedWalletOrigins: (walletOrigin: string) => string[]

getLocalWalletOrigin

La copie locale de walletOrigin, s'il en a une.

Signature

getLocalWalletOrigin: (walletOrigin: string) => string | null

isLocalWalletOriginOf

Seul un sous-domaine HTTPS de l'hôte du portefeuille peut déverrouiller ses passkeys.

Signature

isLocalWalletOriginOf: (localWalletOrigin: string, walletOrigin: string) => boolean

postToWalletPopup

Envoie un message à la popup du portefeuille, quelle que soit l'origine acceptée qu'elle affiche : le navigateur ne le remet qu'à celle sur laquelle se trouve la popup.

Signature

postToWalletPopup: (popup: Window, message: unknown, walletOrigin: string) => void

rememberWalletOrigin

Mémorise laquelle des origines acceptées a répondu pour walletOrigin.

Signature

rememberWalletOrigin: (walletOrigin: string, answeringOrigin: string) => void

toPreferredWalletUrl

Ouvre les requêtes sur la copie locale une fois qu'elle a répondu sur cet appareil, afin que le portefeuille officiel ne soit plus chargé du tout.

Signature

toPreferredWalletUrl: (url: URL) => URL

watchLocalWalletPopup

Ramène la popup sur le portefeuille quand sa copie locale ne répond pas, par exemple parce qu'elle n'est pas lancée. Renvoie la fonction de nettoyage.

Signature

watchLocalWalletPopup: (input: {
popup: Window;
popupUrl: URL;
walletOrigin: string;
requestId: string;
timeoutMs?: number;
}) => (() => void)

localWalletOptOutParam

Demande à un portefeuille de traiter lui-même une requête.

Definition

const localWalletOptOutParam = "localWallet"

officialLocalWalletOrigin

Origine de la copie locale du portefeuille officiel.

Un portefeuille peut avoir une copie locale : le même portefeuille exécuté sur la machine de l'utilisateur, servi sous un sous-domaine de l'hôte du portefeuille, afin qu'il déverrouille les mêmes passkeys. Une application qui fait confiance au portefeuille fait alors aussi confiance à cette copie. La copie du portefeuille officiel est pnpm dev local-organigram; un autre déploiement déclare la sienne via NEXT_PUBLIC_ORGANIGRAM_PASSKEY_WALLET_LOCAL_URL.

Definition

const officialLocalWalletOrigin = "https://local.wallet.organigram.ai:3002"

officialWalletOrigin

Origine du passkey wallet officiel d'Organigram.

Definition

const officialWalletOrigin = "https://wallet.organigram.ai"

passkeyWalletLocalHandoffType

Transmis par un portefeuille avant qu'il ne confie une requête à sa copie locale.

Definition

const passkeyWalletLocalHandoffType = "organigram:wallet:local-handoff"

passkeyWalletReadyType

Transmis par la page de requête de la copie locale dès son chargement.

Definition

const passkeyWalletReadyType = "organigram:wallet:ready"

Se connecter

Les utilisateurs se connectent à une application avec Sign-In with Ethereum. L'application émet un message avec un nonce venant de son serveur, le portefeuille le signe dans une popup, et le serveur vérifie la signature, le domaine et le nonce avant d'ouvrir une session. Avec NextAuth, signInWithPasskeyWallet() exécute tout le parcours dans le navigateur, et authorizePasskeyWalletCredentials() vérifie le résultat dans un fournisseur d'identifiants.

PasskeyWalletPopupInput

Entrée d'une requête de connexion via la popup du portefeuille.

Definition

export type PasskeyWalletPopupInput = {
walletOrigin?: string;
appOrigin?: string;
nonce: string;
chainId: number;
requestId?: string;
requestedAt?: string;
popup?: Window | null;
};

PasskeyWalletStackSessionChangedMessage

Un message transmis par le portefeuille à l'application qui l'a ouvert quand l'utilisateur révoque la session de cette application.

Definition

export type PasskeyWalletStackSessionChangedMessage = {
type: typeof passkeyWalletStackSessionChangedType;
version: 1;
event: 'revoked';
appOrigin: string;
address: `0x${string}` | null;
};

SignInWithPasskeyWalletInput

Entrée de signInWithPasskeyWallet().

Definition

export type SignInWithPasskeyWalletInput = {
chainId?: number;
walletOrigin?: string;
getCsrfToken: () => Promise<string | null | undefined>;
requestWalletSignIn?: (input: WalletSignInInput) => Promise<PasskeyWalletSignInResult>;
submitCredentials?: SubmitCredentials;
};

buildPasskeyWalletSignInPopupUrl

Construire l'URL de la popup du portefeuille pour une requête de connexion, avec l'URL de défi /api/auth/wallet/challenge de l'application.

Signature

buildPasskeyWalletSignInPopupUrl: (input: PasskeyWalletPopupInput) => URL

Paramètres

NomTypeDescription
inputPasskeyWalletPopupInputLa requête de connexion.

createPasskeyWalletStackSessionChangedMessage

Créer un message de changement de session.

Signature

createPasskeyWalletStackSessionChangedMessage: (input: {
event: "revoked";
appOrigin: string;
address?: `0x${string}` | null;
}) => PasskeyWalletStackSessionChangedMessage

Paramètres

NomTypeDescription
input{ event: "revoked"; appOrigin: string; address?: `0x${string}` | null; }L'événement, l'origine de l'application et l'adresse de la session.

notifyCurrentTabNextAuthSessionChanged

Signaler à NextAuth, dans l'onglet courant, que la session a changé, afin qu'il la recharge.

Signature

notifyCurrentTabNextAuthSessionChanged: () => void

notifyPasskeyWalletStackSessionChanged

Transmettre un message de changement de session à la fenêtre qui a ouvert le portefeuille.

Signature

notifyPasskeyWalletStackSessionChanged: (input: {
event: "revoked";
appOrigin: string;
address?: `0x${string}` | null;
targetOrigin?: string;
}) => void

Paramètres

NomTypeDescription
input{ event: "revoked"; appOrigin: string; address?: `0x${string}` | null; targetOrigin?: string; }L'événement, l'origine de l'application, l'adresse de la session et l'origine à laquelle transmettre, par défaut celle de l'application.

parsePasskeyWalletStackSessionChangedMessage

Lire un message de changement de session.

Vérifiez aussi l'origine du MessageEvent qui le transporte : ne faites confiance qu'aux messages du portefeuille.

Signature

parsePasskeyWalletStackSessionChangedMessage: (value: unknown) => PasskeyWalletStackSessionChangedMessage | null

Paramètres

NomTypeDescription
valueunknownLes données du message.

Retourne

TypeDescription
PasskeyWalletStackSessionChangedMessage | nullLe message, ou null si elle est invalide.

requestPasskeyWalletSignIn

Demander au portefeuille, dans une popup, de signer un message Sign-In with Ethereum pour l'application.

N'accepte que les réponses de l'origine du portefeuille et de sa copie locale, pour cette requête. Le résultat n'est pas vérifié : le serveur doit le vérifier avec verifyPasskeyWalletSiwe().

Signature

requestPasskeyWalletSignIn: (input: PasskeyWalletPopupInput & {
timeoutMs?: number;
}) => Promise<PasskeyWalletSignInResult>

Paramètres

NomTypeDescription
inputPasskeyWalletPopupInput & { timeoutMs?: number; }La requête de connexion, et un délai d'expiration, 5 minutes par défaut.

Retourne

TypeDescription
Promise<PasskeyWalletSignInResult>Le message signé.

signInWithPasskeyWallet

Se connecter à une application NextAuth avec le portefeuille.

Ouvre la popup du portefeuille, utilise le jeton CSRF comme nonce du message Sign-In with Ethereum, et soumet le message signé au fournisseur d'identifiants NextAuth, qui le vérifie avec authorizePasskeyWalletCredentials().


import { getCsrfToken } from 'next-auth/react'
await signInWithPasskeyWallet({ getCsrfToken })

Signature

signInWithPasskeyWallet: (input: SignInWithPasskeyWalletInput) => Promise<PasskeyWalletSignInResult>

Paramètres

NomTypeDescription
inputSignInWithPasskeyWalletInputLa fonction d'obtention du jeton CSRF, la chaîne et l'origine du portefeuille.

Retourne

TypeDescription
Promise<PasskeyWalletSignInResult>Le message signé.

passkeyWalletStackSessionChangedType

Type du message signalant à une application que sa session a changé dans le portefeuille.

Definition

const passkeyWalletStackSessionChangedType = "organigram:wallet:stack-session-changed"

submitPasskeyWalletCredentials

Soumettre un message signé au callback d'identifiants NextAuth de l'application, à /api/auth/callback/credentials.

Definition

const submitPasskeyWalletCredentials: SubmitCredentials

AuthorizePasskeyWalletCredentialsInput

Entrée de authorizePasskeyWalletCredentials().

Definition

export type AuthorizePasskeyWalletCredentialsInput = {
credentials: PasskeyWalletNextAuthCredentials | undefined;
domain: string;
nonce: string | null | undefined;
chain?: Chain;
transportUrl: string;
transportOptions?: Parameters<typeof import('viem').http>[1];
};

PasskeyWalletNextAuthCredentials

Identifiants soumis au fournisseur d'identifiants NextAuth.

Definition

export type PasskeyWalletNextAuthCredentials = {
message?: unknown;
signature?: unknown;
csrfToken?: unknown;
};

authorizePasskeyWalletCredentials

Vérifier les identifiants soumis à un fournisseur d'identifiants NextAuth par signInWithPasskeyWallet().

Rejette les identifiants sans message, signature ou nonce, puis les vérifie avec verifyPasskeyWalletSiwe(). Le nonce est le jeton CSRF de la session, que signInWithPasskeyWallet() place dans le message.


CredentialsProvider({
credentials: { message: {}, signature: {} },
authorize: async credentials =>
await authorizePasskeyWalletCredentials({
credentials,
domain: 'app.example.com',
nonce: csrfToken,
transportUrl: rpcUrl
})
})

Signature

authorizePasskeyWalletCredentials: (input: AuthorizePasskeyWalletCredentialsInput) => Promise<PasskeyWalletVerifiedSiwe | null>

Paramètres

NomTypeDescription
inputAuthorizePasskeyWalletCredentialsInputLes identifiants, le domaine et le nonce de l'application, et un point d'accès RPC.

Retourne

TypeDescription
Promise<PasskeyWalletVerifiedSiwe | null>La connexion vérifiée, ou null.

PasskeyWalletChallenge

Un message Sign-In with Ethereum émis par une application pour que le portefeuille le signe.

Definition

export type PasskeyWalletChallenge = {
domain: string;
nonce: string;
issuedAt: string;
expiresAt: string;
message: string;
};

PasskeyWalletVerifiedSiwe

Un message Sign-In with Ethereum vérifié.

Definition

export type PasskeyWalletVerifiedSiwe = {
address: `0x${string}`;
chainId: number;
domain: string;
uri: string;
nonce: string;
encryptionPublicKeyResource: WalletEncryptionPublicKeySiweResource | null;
};

PasskeyWalletVerifySiweInput

Entrée de verifyPasskeyWalletSiwe().

Definition

export type PasskeyWalletVerifySiweInput = {
message: string;
signature: Hex;
domain: string;
nonce: string;
chain?: Chain;
transportUrl: string;
transportOptions?: Parameters<typeof http>[1];
};

buildPasskeyWalletPopupUrl

Construire l'URL de la popup du portefeuille pour une requête de connexion.

Signature

buildPasskeyWalletPopupUrl: (input: {
walletOrigin: string;
domain: string;
challengeUrl: string;
requestId?: string;
requestedAt?: string;
returnUrl?: string;
}) => URL

Paramètres

NomTypeDescription
input{ walletOrigin: string; domain: string; challengeUrl: string; requestId?: string; requestedAt?: string; returnUrl?: string; }L'origine du portefeuille, le domaine de l'application, son URL de défi, et éventuellement l'identifiant de la requête, la date et l'URL de retour.

createPasskeyWalletChallenge

Créer un message Sign-In with Ethereum pour une adresse, valable 5 minutes.

Stockez le nonce sur le serveur, par exemple dans la session, et vérifiez-le avec verifyPasskeyWalletSiwe().

Signature

createPasskeyWalletChallenge: (input: {
request: Request;
address: `0x${string}`;
chainId: number;
encryptionPublicKeyResource?: string;
nonce?: string;
now?: Date;
statement?: string;
uri?: string;
}) => PasskeyWalletChallenge

Paramètres

NomTypeDescription
input{ request: Request; address: `0x${string}`; chainId: number; encryptionPublicKeyResource?: string; nonce?: string; now?: Date; statement?: string; uri?: string; }La requête, l'adresse et la chaîne, et éventuellement la ressource de clé publique issue de createWalletEncryptionPublicKeySiweResource(), un nonce, la date courante, une déclaration et l'URI de l'application, par défaut l'origine de la requête.

createPasskeyWalletManifest

Créer le manifeste d'une application, avec l'URL de défi /api/auth/wallet/challenge sur l'origine de la requête.

Signature

createPasskeyWalletManifest: (request: Request) => PasskeyWalletManifest

Paramètres

NomTypeDescription
requestRequestLa requête du manifeste.

getPasskeyWalletCorsAllowedOrigins

Lister les origines de portefeuille autorisées à appeler les points d'accès de connexion d'une application.

Autorise le portefeuille officiel et sa copie locale, le portefeuille configuré et sa copie locale, les autres origines configurées et, quand l'application tourne sur localhost, le portefeuille servi sur le port 3002 du même hôte.

Signature

getPasskeyWalletCorsAllowedOrigins: (input: {
request: Request;
walletUrl?: string;
allowedOrigins?: string;
}) => string[]

Paramètres

NomTypeDescription
input{ request: Request; walletUrl?: string; allowedOrigins?: string; }La requête, l'URL du portefeuille configuré et les autres origines autorisées, séparées par des virgules.

getPasskeyWalletCorsOrigin

Obtenir l'origine d'une requête si c'est une origine de portefeuille autorisée.

Signature

getPasskeyWalletCorsOrigin: (input: {
request: Request;
walletUrl?: string;
allowedOrigins?: string;
}) => string | null

Paramètres

NomTypeDescription
input{ request: Request; walletUrl?: string; allowedOrigins?: string; }La requête, l'URL du portefeuille configuré et les autres origines autorisées, séparées par des virgules.

Retourne

TypeDescription
string | nullL'origine, ou null.

getPasskeyWalletRequestOrigin

Obtenir l'origine publique d'une requête, à partir des en-têtes X-Forwarded-Host et X-Forwarded-Proto lorsqu'ils sont présents.

Les clients peuvent définir ces en-têtes. Ne vous fiez au résultat que derrière un proxy qui les écrase.

Signature

getPasskeyWalletRequestOrigin: (request: Request) => string

Paramètres

NomTypeDescription
requestRequestLa requête.

isWalletSignInOriginAllowed

Vérifier si une origine fait partie d'une liste d'origines autorisées.

Signature

isWalletSignInOriginAllowed: (origin: string, allowedOrigins: readonly string[]) => boolean

Paramètres

NomTypeDescription
originstringL'origine à vérifier.
allowedOriginsreadonly string[]Les origines autorisées.

verifyPasskeyWalletSiwe

Vérifier un message Sign-In with Ethereum signé par le portefeuille.

Vérifie avec viem la signature, le domaine, le nonce et les dates de validité du message. Ne passez jamais un domaine ou un nonce vide : viem ignore alors leur vérification. Vérifiez que le nonce est celui que l'application a émis pour cette session, et ne l'utilisez qu'une fois.


const verified = await verifyPasskeyWalletSiwe({
message,
signature,
domain: 'app.example.com',
nonce: session.nonce,
transportUrl: rpcUrl
})

Signature

verifyPasskeyWalletSiwe: (input: PasskeyWalletVerifySiweInput) => Promise<PasskeyWalletVerifiedSiwe | null>

Paramètres

NomTypeDescription
inputPasskeyWalletVerifySiweInputLe message, la signature, le domaine et le nonce attendus, et un point d'accès RPC.

Retourne

TypeDescription
Promise<PasskeyWalletVerifiedSiwe | null>La connexion vérifiée, ou null si le message est invalide.

withPasskeyWalletCorsHeaders

Ajouter à une réponse des en-têtes CORS avec identifiants, si la requête vient d'une origine de portefeuille autorisée.

Signature

withPasskeyWalletCorsHeaders: <Response extends {
headers: Headers;
}>(request: Request, response: Response, options?: {
allowedMethods?: string;
walletUrl?: string;
allowedOrigins?: string;
}) => Response

Paramètres

NomTypeDescription
requestRequestLa requête.
responseResponseLa réponse, renvoyée avec ses en-têtes modifiés.
options{ allowedMethods?: string; walletUrl?: string; allowedOrigins?: string; }Méthodes autorisées, GET, OPTIONS par défaut, l'URL du portefeuille configuré et les autres origines autorisées.

PasskeyWalletErrorResult

La réponse du portefeuille à une requête qu'il n'a pas pu traiter.

Definition

export type PasskeyWalletErrorResult = {
type: typeof passkeyWalletErrorType;
version: 1;
requestId: string;
code: 'user_rejected' | 'challenge_unavailable' | 'domain_mismatch' | 'wallet_locked' | 'unsupported_origin' | 'internal_error';
message: string;
};

PasskeyWalletManifest

Comment une application accepte les connexions avec le portefeuille.

Definition

export type PasskeyWalletManifest = {
version: 1;
domain: string;
signInChallengeUrl: string;
signInCompletionUrl?: string;
};

PasskeyWalletSignInRequest

Une requête de connexion à une application avec le portefeuille, lue depuis l'URL de la popup du portefeuille.

Definition

export type PasskeyWalletSignInRequest = {
type: typeof passkeyWalletSignInType;
version: 1;
requestId: string;
domain: string;
challengeUrl: string;
returnUrl?: string;
requestedAt: string;
};

PasskeyWalletSignInResult

La réponse du portefeuille à une requête de connexion : un message Sign-In with Ethereum signé.

Definition

export type PasskeyWalletSignInResult = {
type: typeof passkeyWalletSignInResultType;
version: 1;
requestId: string;
domain: string;
address: `0x${string}`;
message: string;
signature: `0x${string}`;
completedAt: string;
};

assertSignInDomainMatches

Vérifier qu'un message Sign-In with Ethereum est destiné au domaine attendu, avant de le signer.

Signature

assertSignInDomainMatches: (message: string, expectedDomain: string) => void

Paramètres

NomTypeDescription
messagestringLe message.
expectedDomainstringLe domaine de la requête.

parsePasskeyWalletSignInRequest

Lire et vérifier une requête de connexion à partir des paramètres d'URL de la popup du portefeuille.

L'URL de défi doit utiliser HTTPS et appartenir au domaine demandé ou à l'un de ses sous-domaines, et l'URL de retour doit utiliser HTTPS, afin que le portefeuille ne signe que des messages récupérés auprès de l'application qui les demande.

Signature

parsePasskeyWalletSignInRequest: (params: URLSearchParams) => PasskeyWalletSignInRequest

Paramètres

NomTypeDescription
paramsURLSearchParamsLes paramètres d'URL.

resolveSiweDomain

Lire le domaine d'un message Sign-In with Ethereum dans sa première ligne.

Signature

resolveSiweDomain: (message: string) => string

Paramètres

NomTypeDescription
messagestringLe message.

validatePasskeyWalletManifest

Vérifier le manifeste d'une application.

Le domaine du manifeste doit être l'hôte qui le sert, et ses URL doivent utiliser HTTPS et appartenir à ce domaine ou à ses sous-domaines.

Signature

validatePasskeyWalletManifest: (manifest: unknown, servingHost: string) => PasskeyWalletManifest

Paramètres

NomTypeDescription
manifestunknownLe manifeste, analysé depuis le JSON.
servingHoststringL'hôte depuis lequel le manifeste a été récupéré.

passkeyWalletErrorType

Type du message répondant à une requête que le portefeuille n'a pas pu traiter.

Definition

const passkeyWalletErrorType = "organigram:wallet:error"

passkeyWalletSignInResultType

Type du message répondant à une requête de connexion.

Definition

const passkeyWalletSignInResultType = "organigram:wallet:sign-in-result"

passkeyWalletSignInType

Type d'une requête de connexion au portefeuille.

Definition

const passkeyWalletSignInType = "organigram:wallet:sign-in"

Coffres à passkeys

Le portefeuille est un compte Ethereum standard dérivé d'une phrase de récupération BIP-39. La phrase de récupération est chiffrée dans un coffre avec AES-256-GCM, sous une clé dérivée de la sortie PRF d'une passkey WebAuthn, afin que seule cette passkey puisse la déchiffrer. Un portefeuille peut avoir plusieurs passkeys, chacune avec son propre coffre. Ces fonctions s'exécutent dans l'application du portefeuille : un portefeuille déverrouillé garde en mémoire la phrase de récupération et les clés, ne l'y gardez donc que le temps nécessaire, et ne le stockez, ne l'envoyez ni ne le journalisez jamais.

BrowserPasskeyWalletVaultPayload

Les secrets chiffrés dans un coffre à passkey.

Contient la phrase de récupération en clair : ne la stockez, ne l'envoyez ni ne la journalisez jamais hors d'une enveloppe chiffrée.

Definition

export type BrowserPasskeyWalletVaultPayload = {
version: 1;
recoveryPhrase: string;
walletEncryptionKey?: WalletEncryptionKeyPairPayload;
};

PasskeyPrfCredential

Une passkey à évaluer avec son sel PRF.

Definition

export type PasskeyPrfCredential = {
credentialId: string;
transports?: string[];
prfSalt: string;
};

createBrowserPasskeyWalletVaultPayload

Créer le contenu d'un nouveau coffre, avec une nouvelle paire de clés de chiffrement du portefeuille.

Signature

createBrowserPasskeyWalletVaultPayload: (recoveryPhrase: string) => Promise<BrowserPasskeyWalletVaultPayload>

Paramètres

NomTypeDescription
recoveryPhrasestringLa phrase de récupération du portefeuille.

createGeneratedRecoveryPhrase

Générer une nouvelle phrase de récupération BIP-39 anglaise de 12 mots.

Signature

createGeneratedRecoveryPhrase: () => string

decryptVaultPayloadWithPrfOutput

Déchiffrer une enveloppe de coffre avec la sortie PRF de sa passkey.

Ne met pas à zéro la sortie PRF, afin que l'appelant puisse essayer plusieurs enveloppes avec. Mettez-la à zéro une fois terminé.

Signature

decryptVaultPayloadWithPrfOutput: (input: {
envelope: PasskeyVaultEnvelopeData;
prfOutput: Uint8Array;
}) => Promise<BrowserPasskeyWalletVaultPayload>

Paramètres

NomTypeDescription
input{ envelope: PasskeyVaultEnvelopeData; prfOutput: Uint8Array; }L'enveloppe et la sortie PRF.

derivePasskeyWalletAccount

Passer un portefeuille déverrouillé sur un autre de ses comptes.

Signature

derivePasskeyWalletAccount: (input: {
wallet: UnlockedPasskeyWallet;
account: StoredVaultAccount;
}) => UnlockedPasskeyWallet

Paramètres

NomTypeDescription
input{ wallet: UnlockedPasskeyWallet; account: StoredVaultAccount; }Le portefeuille déverrouillé et le compte à sélectionner.

deriveStoredVaultAccount

Dériver d'une phrase de récupération le compte d'un index d'adresse.

Signature

deriveStoredVaultAccount: (input: {
recoveryPhrase: string;
addressIndex: number;
name: string;
}) => StoredVaultAccount

Paramètres

NomTypeDescription
input{ recoveryPhrase: string; addressIndex: number; name: string; }La phrase de récupération, l'index d'adresse et le nom du compte, Account <index + 1> par défaut.

getDerivationPath

Obtenir le chemin de dérivation Ethereum BIP-44 d'un index d'adresse.

Signature

getDerivationPath: (addressIndex: number) => string

Paramètres

NomTypeDescription
addressIndexnumberL'index d'adresse.

hexEncodeMessage

Encoder un message UTF-8 en hexadécimal, comme le transportent les requêtes personal_sign .

Signature

hexEncodeMessage: (message: string) => `0x${string}`

Paramètres

NomTypeDescription
messagestringLe message.

parseBrowserPasskeyWalletVaultPayload

Lire le contenu déchiffré d'un coffre.

Signature

parseBrowserPasskeyWalletVaultPayload: (plaintext: string) => BrowserPasskeyWalletVaultPayload

Paramètres

NomTypeDescription
plaintextstringLe contenu déchiffré, en JSON.

registerAdditionalBrowserPasskeyVault

Créer une autre passkey capable de déverrouiller un portefeuille déverrouillé, par exemple comme passkey de secours.

Signature

registerAdditionalBrowserPasskeyVault: (input: {
wallet: UnlockedPasskeyWallet;
name: string;
accounts: StoredVaultAccount[];
rpId?: string;
rpName?: string;
}) => Promise<{
record: StoredVaultRecord;
wallet: UnlockedPasskeyWallet;
}>

Paramètres

NomTypeDescription
input{ wallet: UnlockedPasskeyWallet; name: string; accounts: StoredVaultAccount[]; rpId?: string; rpName?: string; }Le portefeuille déverrouillé, le nom de la passkey, les comptes qu'elle déverrouille et la partie de confiance WebAuthn.

Retourne

TypeDescription
Promise<{ record: StoredVaultRecord; wallet: UnlockedPasskeyWallet; }>Le nouvel enregistrement de coffre et le portefeuille, désormais rattaché à la nouvelle passkey.

registerBrowserPasskeyVault

Créer une passkey et un coffre qui chiffre avec elle une phrase de récupération.

Demande au navigateur de créer une passkey détectable avec vérification de l'utilisateur et l'extension PRF. La phrase de récupération est chiffrée avec une clé dérivée de la sortie PRF, qui est ensuite mise à zéro. Stockez l'enregistrement renvoyé, qui ne contient aucun secret en clair, et ne gardez le portefeuille déverrouillé qu'en mémoire.


const { record, wallet } = await registerBrowserPasskeyVault({
recoveryPhrase: createGeneratedRecoveryPhrase(),
name: 'My wallet'
})

Signature

registerBrowserPasskeyVault: (input: {
recoveryPhrase: string;
name: string;
rpId?: string;
rpName?: string;
}) => Promise<{
record: StoredVaultRecord;
wallet: UnlockedPasskeyWallet;
}>

Paramètres

NomTypeDescription
input{ recoveryPhrase: string; name: string; rpId?: string; rpName?: string; }La phrase de récupération, le nom du portefeuille, l'identifiant de la partie de confiance WebAuthn, par défaut le nom d'hôte courant, et le nom de la partie de confiance.

Retourne

TypeDescription
Promise<{ record: StoredVaultRecord; wallet: UnlockedPasskeyWallet; }>L'enregistrement de coffre et le portefeuille déverrouillé, sur son premier compte.

requestPasskeyPrfOutput

Exécute une assertion avec vérification de l'utilisateur, limitée aux passkeys données, chacune évaluée avec son propre sel PRF, et renvoie la sortie PRF de la passkey choisie par la personne. L'appelant est responsable de la sortie PRF renvoyée et doit la mettre à zéro une fois sa clé dérivée.

Signature

requestPasskeyPrfOutput: (input: {
credentials: PasskeyPrfCredential[];
rpId?: string;
}) => Promise<{
credentialId: string;
prfOutput: Uint8Array;
}>

signPersonalMessage

Signer un message avec EIP-191 personal_sign.

Signature

signPersonalMessage: (input: {
wallet: UnlockedPasskeyWallet;
message: string;
}) => Promise<`0x${string}`>

Paramètres

NomTypeDescription
input{ wallet: UnlockedPasskeyWallet; message: string; }Le portefeuille déverrouillé et le message.

signTypedDataMessage

Signer des données typées EIP-712.

Signature

signTypedDataMessage: (input: {
wallet: UnlockedPasskeyWallet;
typedData: PasskeyWalletTypedData;
}) => Promise<`0x${string}`>

Paramètres

NomTypeDescription
input{ wallet: UnlockedPasskeyWallet; typedData: PasskeyWalletTypedData; }Le portefeuille déverrouillé et les données typées.

unlockBrowserPasskeyVault

Déverrouiller un portefeuille avec l'une des passkeys de ses coffres.

Demande à l'utilisateur de choisir l'une des passkeys des enregistrements, avec vérification de l'utilisateur. Les coffres de cette passkey sont essayés tour à tour, et le premier dont la phrase de récupération dérive l'adresse de son enregistrement est déverrouillé. La sortie PRF est mise à zéro.


const { wallet } = await unlockBrowserPasskeyVault({ records })
const signature = await signPersonalMessage({ wallet, message: 'Hello' })

Signature

unlockBrowserPasskeyVault: (input: {
records: StoredVaultRecord[];
rpId?: string;
}) => Promise<{
record: StoredVaultRecord;
wallet: UnlockedPasskeyWallet;
}>

Paramètres

NomTypeDescription
input{ records: StoredVaultRecord[]; rpId?: string; }Les enregistrements de coffres parmi lesquels choisir, et l'identifiant de la partie de confiance WebAuthn, par défaut le nom d'hôte courant.

Retourne

TypeDescription
Promise<{ record: StoredVaultRecord; wallet: UnlockedPasskeyWallet; }>L'enregistrement déverrouillé et le portefeuille, sur le premier compte de l'enregistrement.

updateStaticPasskeyVaultEncryptionKey

Déverrouiller un coffre et le rechiffrer avec une autre paire de clés de chiffrement du portefeuille.

Demande une passkey à l'utilisateur, et conserve le sel PRF du coffre. Stockez l'enregistrement renvoyé à la place de l'ancien.

Signature

updateStaticPasskeyVaultEncryptionKey: (input: {
records: StoredVaultRecord[];
walletEncryptionKey: WalletEncryptionKeyPairPayload;
rpId?: string;
}) => Promise<{
record: StoredVaultRecord;
wallet: UnlockedPasskeyWallet;
}>

Paramètres

NomTypeDescription
input{ records: StoredVaultRecord[]; walletEncryptionKey: WalletEncryptionKeyPairPayload; rpId?: string; }Les enregistrements de coffres parmi lesquels choisir, la nouvelle paire de clés et l'identifiant de la partie de confiance WebAuthn.

Retourne

TypeDescription
Promise<{ record: StoredVaultRecord; wallet: UnlockedPasskeyWallet; }>L'enregistrement rechiffré et le portefeuille déverrouillé.

PasskeyVaultEnvelopeData

Un secret chiffré avec une clé dérivée d'une passkey, comme la phrase de récupération d'un portefeuille.

L'enveloppe ne contient aucun secret : elle peut être stockée n'importe où, car seule la passkey qui l'a créée peut la déchiffrer.

Definition

export type PasskeyVaultEnvelopeData = {
algorithm: typeof passkeyVaultAlgorithm;
keyVersion: typeof passkeyVaultKeyVersion;
ciphertext: string;
salt: string;
prfSalt: string;
nonce: string;
};

base64UrlToBytes

Décoder du base64url sans remplissage.

N'accepte que du base64url canonique sans remplissage. Les décodeurs tolérants ignorent silencieusement les caractères inconnus : une valeur altérée pourrait sinon se décoder en d'autres octets que ceux qu'elle semble encoder.

Signature

base64UrlToBytes: (value: string) => Uint8Array

Paramètres

NomTypeDescription
valuestringLa valeur à décoder.

bytesToBase64Url

Encoder des octets en base64url sans remplissage.

Signature

bytesToBase64Url: (bytes: Uint8Array) => string

Paramètres

NomTypeDescription
bytesUint8ArrayLes octets à encoder.

decryptPasskeyVaultSecret

Déchiffrer le secret d'une enveloppe de coffre.

Signature

decryptPasskeyVaultSecret: (input: DecryptPasskeyVaultSecretInput) => Promise<string>

Paramètres

NomTypeDescription
input~DecryptPasskeyVaultSecretInputL'enveloppe et la clé dérivée pour elle.

derivePasskeyVaultKey

Dériver la clé AES-GCM d'un coffre à partir de la sortie PRF d'une passkey.

La clé ne peut pas être exportée. Une copie de la sortie PRF faite pour l'import est ensuite mise à zéro, mais pas l'original : mettez-le à zéro dès que vous n'en avez plus besoin.

Signature

derivePasskeyVaultKey: (input: DerivePasskeyVaultKeyInput) => Promise<CryptoKey>

Paramètres

NomTypeDescription
input~DerivePasskeyVaultKeyInputLa sortie PRF de 32 octets, le sel de 32 octets du coffre et un info HKDF facultatif qui sépare les clés dérivées d'une même sortie PRF pour des usages différents.

encryptPasskeyVaultSecret

Chiffrer un secret avec une clé de coffre en une enveloppe de coffre.

Signature

encryptPasskeyVaultSecret: (input: EncryptPasskeyVaultSecretInput) => Promise<PasskeyVaultEnvelopeData>

Paramètres

NomTypeDescription
input~EncryptPasskeyVaultSecretInputLe secret, la clé issue de derivePasskeyVaultKey(), le sel avec lequel elle a été dérivée, le sel PRF de 32 octets et un nonce facultatif de 12 octets, aléatoire par défaut. Ne réutilisez jamais un nonce avec la même clé.

getCrypto

Obtenir la Web Crypto API de l'environnement.

Signature

getCrypto: () => Crypto

hasBase64UrlByteLength

Vérifier qu'une valeur est du base64url canonique dont la longueur décodée passe un test.

Signature

hasBase64UrlByteLength: (value: unknown, isValidLength: (byteLength: number) => boolean) => boolean

Paramètres

NomTypeDescription
valueunknownLa valeur à vérifier.
isValidLength(byteLength: number) => booleanTest de la longueur décodée, en octets.

isPasskeyPrfSupported

Vérifier si une passkey nouvellement créée a activé l'extension PRF, dont le portefeuille a besoin pour dériver ses clés.

Signature

isPasskeyPrfSupported: (input: {
credential: PrfSupportCredential | null;
}) => Promise<boolean>

Paramètres

NomTypeDescription
input{ credential: ~PrfSupportCredential | null; }L'identifiant renvoyé par navigator.credentials.create().

isPasskeyVaultEnvelope

Vérifier qu'une valeur est une enveloppe de coffre à passkey de l'algorithme et de la version de clé actuels, avec des sels, un nonce et un texte chiffré de longueurs valides.

Signature

isPasskeyVaultEnvelope: (value: unknown) => value is PasskeyVaultEnvelopeData

Paramètres

NomTypeDescription
valueunknownLa valeur à vérifier.

randomBytes

Générer des octets aléatoires cryptographiquement sûrs.

Signature

randomBytes: (length: number) => Uint8Array

Paramètres

NomTypeDescription
lengthnumberNombre d'octets.

toArrayBuffer

Copier les octets d'une vue dans un nouveau ArrayBuffer.

Signature

toArrayBuffer: (bytes: Uint8Array) => ArrayBuffer

Paramètres

NomTypeDescription
bytesUint8ArrayLes octets à copier.

passkeyVaultAlgorithm

Algorithme des coffres à passkeys : AES-256-GCM avec une clé dérivée par HKDF-SHA-256 de la sortie PRF de la passkey.

Definition

const passkeyVaultAlgorithm = "AES-GCM-HKDF-SHA-256"

passkeyVaultKeyVersion

Version de la dérivation de clé des coffres à passkeys.

Definition

const passkeyVaultKeyVersion = 2

textDecoder

Décodeur UTF-8 partagé.

Definition

const textDecoder: TextDecoder

textEncoder

Encodeur UTF-8 partagé.

Definition

const textEncoder: TextEncoder

PasskeyProviderEvent

Événements émis par le fournisseur EIP-1193 du portefeuille.

Definition

export type PasskeyProviderEvent = 'accountsChanged' | 'chainChanged' | 'disconnect';

PasskeyProviderListener

Écouteur d'un événement du fournisseur.

Definition

export type PasskeyProviderListener = (...args: unknown[]) => void;

PasskeyRegistrationResult

L'adresse et la passkey d'un portefeuille nouvellement enregistré.

Definition

export type PasskeyRegistrationResult = {
address: `0x${string}`;
credentialId: string;
};

UnlockedPasskeyWallet

Un portefeuille déverrouillé avec une passkey, prêt à signer.

Il garde en mémoire la phrase de récupération et les clés privées. Ne le gardez en mémoire que le temps nécessaire, et ne le stockez, ne l'envoyez ni ne le journalisez jamais.

Definition

export type UnlockedPasskeyWallet = {
address: `0x${string}`;
account: HDAccount;
recoveryPhrase: string;
walletEncryptionKey?: WalletEncryptionKeyPairPayload;
credentialId: string;
};

organigramPasskeyWalletIcon

Chemin de l'icône du passkey wallet, relatif à l'application qui le sert.

Definition

const organigramPasskeyWalletIcon = "/png/logo-gradient.png"

organigramPasskeyWalletId

Identifiant du connecteur du passkey wallet.

Definition

const organigramPasskeyWalletId = "organigram-passkeys"

Enregistrements de coffres

Un enregistrement de coffre contient une enveloppe de coffre avec les informations publiques nécessaires pour la déverrouiller : les comptes, la passkey et son appareil. Les enregistrements ne contiennent aucun secret en clair, ils peuvent donc être stockés dans le navigateur ou exportés. Ces fonctions lisent, listent et mettent à jour les enregistrements.

StoredVaultAccount

Un compte d'un portefeuille, dérivé de sa phrase de récupération.

Definition

export type StoredVaultAccount = {
address: `0x${string}`;
name: string;
addressIndex: number;
derivationPath: string;
};

StoredVaultRecord

Un coffre de portefeuille chiffré pour une passkey, avec les informations publiques nécessaires pour le déverrouiller.

Un portefeuille a un enregistrement par passkey capable de le déverrouiller. L'enregistrement ne contient aucun secret en clair : seule sa passkey peut déchiffrer l'enveloppe.

Definition

export type StoredVaultRecord = {
version: 1;
address: `0x${string}`;
accounts: StoredVaultAccount[];
credentialId: string;
rawCredentialId?: string;
name: string;
transports: string[];
passkeyDevice: {
kind: 'macos' | 'ios' | 'ipados' | 'windows' | 'android' | 'linux' | 'security-key' | 'cross-device' | 'platform' | 'passkey';
label: string;
};
createdAt: string;
lastUsedAt: string | null;
envelope: PasskeyVaultEnvelopeData;
};

VaultRegistry

Une liste d'enregistrements de coffres, telle que stockée ou exportée.

Definition

export type VaultRegistry = {
version: 1;
vaults: StoredVaultRecord[];
};

addAccountToVaultRecords

Ajouter un compte à chaque coffre du portefeuille qui contient un autre compte.

Signature

addAccountToVaultRecords: (input: {
vaults: StoredVaultRecord[];
sourceAddress: `0x${string}`;
account: StoredVaultAccount;
}) => StoredVaultRecord[]

Paramètres

NomTypeDescription
input{ vaults: StoredVaultRecord[]; sourceAddress: `0x${string}`; account: StoredVaultAccount; }Les enregistrements de coffres, un compte que le portefeuille contient déjà, et le compte à ajouter.

createVaultRegistry

Envelopper des enregistrements de coffres dans un registre.

Signature

createVaultRegistry: (vaults: StoredVaultRecord[]) => VaultRegistry

Paramètres

NomTypeDescription
vaultsStoredVaultRecord[]Les enregistrements de coffres.

isStoredVaultRecord

Vérifier qu'une valeur est un enregistrement de coffre valide.

Signature

isStoredVaultRecord: (value: unknown) => value is StoredVaultRecord

Paramètres

NomTypeDescription
valueunknownLa valeur à vérifier.

markVaultRecordUsed

Définir la date du dernier déverrouillage d'un coffre.

Signature

markVaultRecordUsed: (input: {
vaults: StoredVaultRecord[];
credentialId: string;
usedAt?: string;
}) => StoredVaultRecord[]

Paramètres

NomTypeDescription
input{ vaults: StoredVaultRecord[]; credentialId: string; usedAt?: string; }Les enregistrements de coffres, l'identifiant de la passkey et la date, maintenant par défaut.

parseVaultRegistry

Lire un registre de coffres, en écartant les enregistrements invalides.

Signature

parseVaultRegistry: (value: unknown) => VaultRegistry

Paramètres

NomTypeDescription
valueunknownLe registre, analysé depuis le JSON.

removeAccountFromVaultRecords

Retirer un compte de chaque coffre, ainsi que les coffres laissés sans compte.

Cela ne retire que des enregistrements locaux. Sans coffre restant ni phrase de récupération exportée, le compte ne peut plus être déverrouillé.

Signature

removeAccountFromVaultRecords: (input: {
vaults: StoredVaultRecord[];
address: `0x${string}`;
}) => StoredVaultRecord[]

Paramètres

NomTypeDescription
input{ vaults: StoredVaultRecord[]; address: `0x${string}`; }Les enregistrements de coffres et l'adresse du compte.

removeVaultRecord

Retirer l'enregistrement de coffre d'une passkey.

Signature

removeVaultRecord: (input: {
vaults: StoredVaultRecord[];
credentialId: string;
}) => StoredVaultRecord[]

Paramètres

NomTypeDescription
input{ vaults: StoredVaultRecord[]; credentialId: string; }Les enregistrements de coffres et l'identifiant de la passkey.

removeVaultRecords

Retirer les enregistrements de coffres de plusieurs passkeys.

Signature

removeVaultRecords: (input: {
vaults: StoredVaultRecord[];
credentialIds: Set<string>;
}) => StoredVaultRecord[]

Paramètres

NomTypeDescription
input{ vaults: StoredVaultRecord[]; credentialIds: Set<string>; }Les enregistrements de coffres et les identifiants des passkeys.

serializeVaultRegistry

Sérialiser des enregistrements de coffres sous forme de registre en JSON.

Signature

serializeVaultRegistry: (vaults: StoredVaultRecord[], space?: number) => string

Paramètres

NomTypeDescription
vaultsStoredVaultRecord[]Les enregistrements de coffres.
spacenumberIndentation du JSON.

upsertVaultRecord

Ajouter un enregistrement de coffre, ou remplacer celui de la même passkey, et le placer en premier.

Signature

upsertVaultRecord: (input: {
vaults: StoredVaultRecord[];
record: StoredVaultRecord;
}) => StoredVaultRecord[]

Paramètres

NomTypeDescription
input{ vaults: StoredVaultRecord[]; record: StoredVaultRecord; }Les enregistrements de coffres et l'enregistrement à ajouter.

vaultHasAccount

Vérifier si un coffre contient un compte, sans tenir compte de la casse de l'adresse.

Signature

vaultHasAccount: (vault: StoredVaultRecord, address: string) => boolean

Paramètres

NomTypeDescription
vaultStoredVaultRecordL'enregistrement de coffre.
addressstringL'adresse du compte.

VaultRegistryGroup

Enregistrements de coffres contenant les mêmes comptes, généralement les passkeys d'un même portefeuille.

Definition

export type VaultRegistryGroup = {
id: string;
accounts: StoredVaultAccount[];
passkeys: StoredVaultRecord[];
createdAt: string;
};

WalletGroup

Un compte avec les passkeys capables de le déverrouiller.

Definition

export type WalletGroup = {
address: `0x${string}`;
name: string;
addressIndex: number;
derivationPath: string;
passkeys: StoredVaultRecord[];
};

formatAddress

Raccourcir une adresse pour l'affichage, sous la forme 0x1234...abcd.

Signature

formatAddress: (address: string) => string

Paramètres

NomTypeDescription
addressstringL'adresse.

formatCredentialId

Raccourcir pour l'affichage un identifiant de passkey de plus de 18 caractères.

Signature

formatCredentialId: (credentialId: string) => string

Paramètres

NomTypeDescription
credentialIdstringL'identifiant de la passkey.

getNextAddressIndex

Obtenir l'index d'adresse du prochain compte à dériver : un de plus que le plus grand index des enregistrements, ou 0.

Signature

getNextAddressIndex: (records: StoredVaultRecord[]) => number

Paramètres

NomTypeDescription
recordsStoredVaultRecord[]Les enregistrements de coffres.

getVaultAccount

Trouver un compte d'un enregistrement de coffre, sans tenir compte de la casse de l'adresse.

Signature

getVaultAccount: (vault: StoredVaultRecord, address: string) => StoredVaultAccount | null

Paramètres

NomTypeDescription
vaultStoredVaultRecordL'enregistrement de coffre.
addressstringL'adresse du compte.

Retourne

TypeDescription
StoredVaultAccount | nullLe compte, ou null.

getVaultRegistryGroupId

Identifier l'ensemble des comptes d'un enregistrement de coffre, par index d'adresse et adresse.

Signature

getVaultRegistryGroupId: (vault: StoredVaultRecord) => string

Paramètres

NomTypeDescription
vaultStoredVaultRecordL'enregistrement de coffre.

groupVaultRecordsBySeed

Regrouper les enregistrements de coffres contenant les mêmes comptes, du plus ancien au plus récent.

Signature

groupVaultRecordsBySeed: (vaults: StoredVaultRecord[]) => VaultRegistryGroup[]

Paramètres

NomTypeDescription
vaultsStoredVaultRecord[]Les enregistrements de coffres.

groupVaultsByWallet

Regrouper les enregistrements de coffres par compte, triés par index d'adresse.

Signature

groupVaultsByWallet: (vaults: StoredVaultRecord[]) => WalletGroup[]

Paramètres

NomTypeDescription
vaultsStoredVaultRecord[]Les enregistrements de coffres.

mergeVaults

Fusionner des enregistrements de coffres importés dans les enregistrements locaux, du plus récent au plus ancien.

Un enregistrement importé remplace l'enregistrement local de la même passkey.

Signature

mergeVaults: (localVaults: StoredVaultRecord[], importedVaults: StoredVaultRecord[]) => StoredVaultRecord[]

Paramètres

NomTypeDescription
localVaultsStoredVaultRecord[]Les enregistrements locaux.
importedVaultsStoredVaultRecord[]Les enregistrements importés.

Sauvegardes

Les enregistrements de coffres peuvent être sauvegardés sur un serveur. Chaque sauvegarde n'expose que son enveloppe de coffre et l'identifiant de sa passkey : le reste de l'enregistrement est chiffré avec une clé dérivée de la phrase de récupération, si bien que le serveur n'apprend rien au-delà de l'adresse du portefeuille, et que n'importe quelle passkey du portefeuille peut restaurer toutes les sauvegardes.

RemoteVaultBackupPackage

Les sauvegardes d'un portefeuille, telles qu'exportées ou restaurées.

Definition

export type RemoteVaultBackupPackage = {
version: 1;
address: `0x${string}`;
backups: RemoteVaultBackupRecord[];
exportedAt: string;
};

RemoteVaultBackupRecord

Un enregistrement de coffre chiffré pour être sauvegardé sur un serveur.

Une sauvegarde expose son enveloppe de coffre, que seule sa propre passkey peut déchiffrer, avec l'identifiant de cette passkey. Le reste de l'enregistrement de coffre (adresses des comptes, noms, appareils) est chiffré avec une clé dérivée de la phrase de récupération, si bien que n'importe quelle passkey du portefeuille peut restaurer toutes les sauvegardes, tandis que le serveur n'apprend rien au-delà de l'adresse du portefeuille.

Definition

export type RemoteVaultBackupRecord = {
version: 2;
backupId: string;
credentialId: string;
envelope: PasskeyVaultEnvelopeData;
salt: string;
iv: string;
ciphertext: string;
createdAt: string;
};

createRemoteVaultBackupPackage

Envelopper les sauvegardes d'un portefeuille dans un paquet.

Signature

createRemoteVaultBackupPackage: (input: {
address: `0x${string}`;
backups: RemoteVaultBackupRecord[];
}) => RemoteVaultBackupPackage

Paramètres

NomTypeDescription
input{ address: `0x${string}`; backups: RemoteVaultBackupRecord[]; }L'adresse du portefeuille et ses sauvegardes.

createRemoteVaultBackupRecord

Chiffrer un enregistrement de coffre pour le sauvegarder.

La clé de sauvegarde est dérivée par HKDF d'un hash SHA-256 de la phrase de récupération, d'un sel aléatoire et de l'adresse. La phrase de récupération elle-même ne fait jamais partie de la sauvegarde.

Signature

createRemoteVaultBackupRecord: (input: {
address: `0x${string}`;
record: StoredVaultRecord;
recoveryPhrase: string;
}) => Promise<RemoteVaultBackupRecord>

Paramètres

NomTypeDescription
input{ address: `0x${string}`; record: StoredVaultRecord; recoveryPhrase: string; }L'adresse du portefeuille, l'enregistrement de coffre et la phrase de récupération du portefeuille.

createVaultBackupDigest

Hacher des sauvegardes avec SHA-256, sur une sérialisation JSON aux clés triées.

Signature

createVaultBackupDigest: (backups: RemoteVaultBackupRecord[]) => Promise<string>

Paramètres

NomTypeDescription
backupsRemoteVaultBackupRecord[]Les sauvegardes.

Retourne

TypeDescription
Promise<string>L'empreinte, en hexadécimal.

createVaultBackupSignatureMessage

Construire le message que le portefeuille signe pour autoriser le stockage des sauvegardes.

Signature

createVaultBackupSignatureMessage: (input: {
address: `0x${string}`;
vaultCount: number;
digest: string;
}) => string

Paramètres

NomTypeDescription
input{ address: `0x${string}`; vaultCount: number; digest: string; }L'adresse du portefeuille, le nombre de sauvegardes et leur empreinte issue de createVaultBackupDigest().

decryptRemoteVaultBackupRecord

Déchiffrer un enregistrement de coffre à partir d'une sauvegarde.

Le résultat n'est pas validé : vérifiez-le avec isStoredVaultRecord() avant de l'utiliser.

Signature

decryptRemoteVaultBackupRecord: (input: {
address: `0x${string}`;
backup: RemoteVaultBackupRecord;
recoveryPhrase: string;
}) => Promise<StoredVaultRecord>

Paramètres

NomTypeDescription
input{ address: `0x${string}`; backup: RemoteVaultBackupRecord; recoveryPhrase: string; }L'adresse du portefeuille, la sauvegarde et la phrase de récupération du portefeuille.

normalizeBackupAddress

Vérifier une adresse saisie par un utilisateur pour restaurer des sauvegardes, et lui appliquer la casse de contrôle.

Signature

normalizeBackupAddress: (value: string) => `0x${string}`

Paramètres

NomTypeDescription
valuestringL'adresse.

parseRemoteVaultBackupPackage

Lire un paquet de sauvegardes.

Signature

parseRemoteVaultBackupPackage: (value: unknown) => RemoteVaultBackupPackage

Paramètres

NomTypeDescription
valueunknownLe paquet, analysé depuis le JSON.

Chiffrement de bout en bout

Chaque portefeuille a une paire de clés ECDH P-256, stockée dans ses coffres, pour chiffrer des fichiers et des textes que lui seul peut déchiffrer. Sa clé publique peut être partagée avec une application dans une ressource Sign-In with Ethereum. Les textes chiffrés pour une application sont liés à l'origine de cette application, si bien qu'une autre application ne peut pas les faire déchiffrer.

WalletDecryptedFile

Un fichier déchiffré.

Definition

export type WalletDecryptedFile = {
name: string;
type: string;
bytes: Uint8Array;
lastModified?: number;
};

WalletEncryptedFilePackage

Un fichier chiffré pour le portefeuille qui l'a chiffré.

Definition

export type WalletEncryptedFilePackage = {
version: 1;
kind: 'organigram:wallet-encrypted-file';
algorithm: 'ECDH-P256+A256GCM';
recipient: {
address: `0x${string}`;
publicKey: JsonWebKey;
keyVersion: number;
};
file: {
name: string;
type: string;
size: number;
lastModified?: number;
};
iv: string;
ciphertext: string;
encryptedAt: string;
};

WalletEncryptedPayload

Un texte chiffré par un portefeuille pour lui-même, qu'une seule origine d'application peut faire déchiffrer.

Definition

export type WalletEncryptedPayload = {
version: 1;
kind: 'organigram:wallet-encrypted-payload';
algorithm: 'ECDH-P256+A256GCM';
appOrigin: string;
recipient: {
address: `0x${string}`;
publicKey: JsonWebKey;
keyVersion: number;
};
iv: string;
ciphertext: string;
encryptedAt: string;
};

WalletEncryptionKeyPairPayload

La paire de clés ECDH P-256 d'un portefeuille pour le chiffrement de bout en bout, stockée dans ses coffres à passkeys.

Contient la clé privée en clair : ne la gardez que dans le coffre chiffré et en mémoire, et ne la stockez, ne l'envoyez ni ne la journalisez jamais ailleurs.

Definition

export type WalletEncryptionKeyPairPayload = {
version: 1;
algorithm: 'ECDH-P256';
privateKey: JsonWebKey;
publicKey: JsonWebKey;
keyVersion: number;
};

WalletEncryptionPublicKeySiweResource

La clé publique d'un portefeuille, lue dans une ressource Sign-In with Ethereum.

Definition

export type WalletEncryptionPublicKeySiweResource = {
kind: typeof encryptionPublicKeyResourceKind;
address: string;
publicKey: JsonWebKey;
keyVersion: number;
};

createWalletEncryptionKeyPair

Générer une nouvelle paire de clés ECDH P-256 pour un portefeuille.

La clé privée est exportable, afin de pouvoir être stockée dans les coffres à passkeys du portefeuille. Gardez-la là.

Signature

createWalletEncryptionKeyPair: () => Promise<WalletEncryptionKeyPairPayload>

createWalletEncryptionPublicKeySiweResource

Encoder la clé publique d'un portefeuille comme ressource d'un message Sign-In with Ethereum.

Se connecter avec cette ressource permet à l'application d'apprendre la clé publique du portefeuille, liée à son adresse par la signature.

Signature

createWalletEncryptionPublicKeySiweResource: (input: {
address: `0x${string}`;
keyPair: WalletEncryptionKeyPairPayload;
}) => string

Paramètres

NomTypeDescription
input{ address: `0x${string}`; keyPair: WalletEncryptionKeyPairPayload; }L'adresse du portefeuille et sa paire de clés. Seule la clé publique est encodée.

decryptFileWithWalletEncryptionKey

Déchiffrer un fichier chiffré avec encryptFileWithWalletEncryptionKey().

Signature

decryptFileWithWalletEncryptionKey: (input: {
encryptedPackage: WalletEncryptedFilePackage;
keyPair: WalletEncryptionKeyPairPayload;
}) => Promise<WalletDecryptedFile>

Paramètres

NomTypeDescription
input{ encryptedPackage: WalletEncryptedFilePackage; keyPair: WalletEncryptionKeyPairPayload; }Le paquet chiffré et la paire de clés du portefeuille.

decryptPayloadWithWalletEncryptionKey

Déchiffrer un texte chiffré avec encryptPayloadWithWalletEncryptionKey().

Signature

decryptPayloadWithWalletEncryptionKey: (input: {
encryptedPayload: WalletEncryptedPayload;
appOrigin: string;
keyPair: WalletEncryptionKeyPairPayload;
}) => Promise<string>

Paramètres

NomTypeDescription
input{ encryptedPayload: WalletEncryptedPayload; appOrigin: string; keyPair: WalletEncryptionKeyPairPayload; }Le contenu chiffré, l'origine de l'application qui le demande, et la paire de clés du portefeuille.

encryptFileWithWalletEncryptionKey

Chiffrer un fichier afin que seul le portefeuille détenant la paire de clés puisse le déchiffrer.

La clé AES-GCM est dérivée par ECDH entre les clés privée et publique de la même paire. Le nom, le type, la taille et la date du fichier restent en clair et ne sont pas authentifiés avec le texte chiffré.

Signature

encryptFileWithWalletEncryptionKey: (input: {
address: `0x${string}`;
file: File;
keyPair: WalletEncryptionKeyPairPayload;
}) => Promise<WalletEncryptedFilePackage>

Paramètres

NomTypeDescription
input{ address: `0x${string}`; file: File; keyPair: WalletEncryptionKeyPairPayload; }L'adresse du portefeuille, le fichier et la paire de clés.

encryptPayloadWithWalletEncryptionKey

Chiffrer un texte afin que seul le portefeuille détenant la paire de clés puisse le déchiffrer, pour une origine d'application donnée.

L'origine de l'application, l'adresse et la version de clé sont authentifiées avec le texte chiffré, si bien que le contenu ne peut pas être déchiffré pour une autre application ni réétiqueté pour elle.

Signature

encryptPayloadWithWalletEncryptionKey: (input: {
address: `0x${string}`;
appOrigin: string;
plaintext: string;
keyPair: WalletEncryptionKeyPairPayload;
}) => Promise<WalletEncryptedPayload>

Paramètres

NomTypeDescription
input{ address: `0x${string}`; appOrigin: string; plaintext: string; keyPair: WalletEncryptionKeyPairPayload; }L'adresse du portefeuille, l'origine de l'application, le texte et la paire de clés.

parseWalletEncryptedFilePackage

Lire un paquet de fichier chiffré.

Signature

parseWalletEncryptedFilePackage: (value: unknown) => WalletEncryptedFilePackage

Paramètres

NomTypeDescription
valueunknownLe paquet, analysé depuis le JSON.

parseWalletEncryptedPayload

Lire un contenu chiffré.

Signature

parseWalletEncryptedPayload: (value: unknown) => WalletEncryptedPayload

Paramètres

NomTypeDescription
valueunknownLe contenu, analysé depuis le JSON.

parseWalletEncryptionKeyPair

Lire une paire de clés de chiffrement de portefeuille.

Signature

parseWalletEncryptionKeyPair: (value: unknown) => WalletEncryptionKeyPairPayload

Paramètres

NomTypeDescription
valueunknownLa paire de clés, analysée depuis le JSON.

parseWalletEncryptionPublicKeySiweResource

Lire la clé publique d'un portefeuille dans les ressources d'un message Sign-In with Ethereum.

Ne vous fiez au résultat qu'une fois la signature du message vérifiée.

Signature

parseWalletEncryptionPublicKeySiweResource: (input: {
address: string;
resources: string[] | undefined;
}) => WalletEncryptionPublicKeySiweResource | null

Paramètres

NomTypeDescription
input{ address: string; resources: string[] | undefined; }L'adresse qui a signé le message, et les ressources du message.

Retourne

TypeDescription
WalletEncryptionPublicKeySiweResource | nullLa clé publique, ou null si aucune ressource valide de cette adresse n'est trouvée.

Modifier cette page

Sur cette page:

L'identité web3, enfin résolue
Déverrouiller et signer avec des passkeys

Suivez-nous :

© 2026 Organigram SAS

Tous droits réservés.