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
TypeScript
/**
* 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;