UNPKG

sui-svelte-wallet-kit

Version:

Svelte 5 wallet kit for Sui: connect wallets, manage accounts, SuiNS, balance, sign transactions/messages

131 lines (130 loc) 5.02 kB
/** * PasskeyWalletAdapter * Implements SuiWalletAdapter interface for passkey-based accounts * Based on Mysten Labs passkey-example: https://github.com/MystenLabs/passkey-example */ import type { WalletAccount } from '@wallet-standard/core'; import type { SuiWalletAdapter, SignAndExecuteTransactionParams, SignTransactionParams, SignTransactionResult, SignPersonalMessageParams, SignMessageResult } from '../SuiModule/types.js'; import { type PasskeyConfig, type PasskeyCredential, type CredentialStorage } from '../PasskeyService/index.js'; /** * Extended WalletAccount for passkey accounts */ export interface PasskeyAccount extends WalletAccount { address: string; publicKey: Uint8Array; chains: readonly `sui:${string}`[]; features: readonly `${string}:${string}`[]; credentialId: string; } /** Wallet icon type (data URL format) */ export type WalletIconDataUrl = `data:image/svg+xml;base64,${string}` | `data:image/webp;base64,${string}` | `data:image/png;base64,${string}` | `data:image/gif;base64,${string}`; /** * Extended PasskeyConfig with optional storage */ export interface PasskeyAdapterConfig extends PasskeyConfig { storage?: CredentialStorage; network?: 'mainnet' | 'testnet' | 'devnet'; /** Custom icon for the passkey wallet (must be a data URL in svg, png, webp, or gif format) */ icon?: WalletIconDataUrl; } /** * PasskeyWalletAdapter class */ export declare class PasskeyWalletAdapter implements SuiWalletAdapter { readonly name = "Passkey"; readonly version: "1.0.0"; readonly icon: WalletIconDataUrl; readonly chains: readonly ["sui:mainnet", "sui:testnet", "sui:devnet"]; private config; private storage; private _accounts; private _connected; private currentCredential; private passkeyKeypair; private passkeyProvider; constructor(config: PasskeyAdapterConfig); get accounts(): readonly PasskeyAccount[]; get features(): { readonly 'standard:connect': { readonly connect: () => Promise<void>; }; readonly 'standard:disconnect': { readonly disconnect: () => Promise<void>; }; readonly 'sui:signAndExecuteTransaction': { readonly signAndExecuteTransaction: (params: SignAndExecuteTransactionParams) => Promise<any>; }; readonly 'sui:signTransaction': { readonly signTransaction: (params: SignTransactionParams) => Promise<SignTransactionResult>; }; readonly 'sui:signPersonalMessage': { readonly signPersonalMessage: (params: SignPersonalMessageParams) => Promise<SignMessageResult>; }; readonly 'passkey:getCredential': { readonly getCredential: () => Promise<PasskeyCredential | null>; }; }; /** * Connect to passkey wallet * Always tries to authenticate with existing passkey first (allows recovery after localStorage clear) * Falls back to creating new passkey if authentication fails */ connect(): Promise<void>; /** * Silent connect - restore from storage without prompting * Used for auto-connect on page refresh * Returns true if successfully restored, false if no stored credentials */ silentConnect(): Promise<boolean>; /** * Authenticate with existing passkey using signAndRecover * This prompts user once to select an existing passkey, then verifies against stored public keys */ private authenticateExistingWallet; /** * Create/connect passkey wallet using PasskeyKeypair.getPasskeyInstance * This always prompts user to select/create a passkey, ensuring public key matches */ private createNewWallet; /** * Disconnect from passkey wallet */ disconnect(): Promise<void>; /** * Sign and execute a transaction * Following Mysten Labs passkey-example approach */ signAndExecuteTransaction(params: SignAndExecuteTransactionParams): Promise<any>; /** * Sign (but do NOT execute) a transaction. * This is required for multisig "collect signatures" flows. * * Important: we intentionally do NOT override sender here. The caller may set * sender to a multisig address to ensure all signers sign identical bytes. */ signTransaction(params: SignTransactionParams): Promise<SignTransactionResult>; /** * Sign a personal message */ signPersonalMessage(params: SignPersonalMessageParams): Promise<SignMessageResult>; /** * Get current credential */ getCredential(): Promise<PasskeyCredential | null>; /** * Check if connected */ isConnected(): boolean; /** * Set up account from credential */ private setupAccount; /** * Get RPC URL for network using SDK's getFullnodeUrl */ private getRpcUrl; } /** * Create a PasskeyWalletAdapter instance */ export declare function createPasskeyWalletAdapter(config: PasskeyAdapterConfig): PasskeyWalletAdapter;