stint-signer
Version:
Short-lived, non-custodial session signer using passkeys for Cosmos SDK
1 lines • 81.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/passkey.ts","../src/execute.ts","../src/stint.ts"],"names":["privateKey","config","Any"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Custom error class for Stint-specific errors\n */\nexport class StintError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'StintError'\n }\n}\n\n/**\n * Standard error codes used throughout the library\n */\nexport const ErrorCodes = {\n // WebAuthn and Passkey errors\n WEBAUTHN_NOT_SUPPORTED: 'WEBAUTHN_NOT_SUPPORTED',\n PASSKEY_CREATION_FAILED: 'PASSKEY_CREATION_FAILED',\n PASSKEY_AUTHENTICATION_FAILED: 'PASSKEY_AUTHENTICATION_FAILED',\n PRF_NOT_SUPPORTED: 'PRF_NOT_SUPPORTED',\n USER_CANCELLED: 'USER_CANCELLED',\n\n // Client initialization errors\n CLIENT_INITIALIZATION_FAILED: 'CLIENT_INITIALIZATION_FAILED',\n SIGNER_EXTRACTION_FAILED: 'SIGNER_EXTRACTION_FAILED',\n RPC_URL_EXTRACTION_FAILED: 'RPC_URL_EXTRACTION_FAILED',\n\n // Grant checking errors\n GRANT_CHECK_FAILED: 'GRANT_CHECK_FAILED',\n INVALID_RESPONSE: 'INVALID_RESPONSE',\n\n // Validation errors\n INVALID_ADDRESS: 'INVALID_ADDRESS',\n INVALID_AMOUNT: 'INVALID_AMOUNT',\n INVALID_DENOMINATION: 'INVALID_DENOMINATION',\n INVALID_RPC_URL: 'INVALID_RPC_URL',\n\n // Key generation errors\n KEY_GENERATION_FAILED: 'KEY_GENERATION_FAILED',\n} as const\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes]\n","/**\n * Logger interface that can be implemented by users\n */\nexport interface Logger {\n debug(message: string, context?: Record<string, unknown>): void\n info(message: string, context?: Record<string, unknown>): void\n warn(message: string, context?: Record<string, unknown>): void\n error(message: string, error?: Error, context?: Record<string, unknown>): void\n}\n\n/**\n * Simple console-based logger implementation\n * Users can provide their own logger that implements the Logger interface\n */\nexport const consoleLogger: Logger = {\n debug: (message: string, context?: Record<string, unknown>) => {\n if (context) {\n console.log(`[Stint] ${message}`, context)\n } else {\n console.log(`[Stint] ${message}`)\n }\n },\n\n info: (message: string, context?: Record<string, unknown>) => {\n if (context) {\n console.info(`[Stint] ${message}`, context)\n } else {\n console.info(`[Stint] ${message}`)\n }\n },\n\n warn: (message: string, context?: Record<string, unknown>) => {\n if (context) {\n console.warn(`[Stint] ${message}`, context)\n } else {\n console.warn(`[Stint] ${message}`)\n }\n },\n\n error: (message: string, error?: Error, context?: Record<string, unknown>) => {\n if (error && context) {\n console.error(`[Stint] ${message}`, error, context)\n } else if (error) {\n console.error(`[Stint] ${message}`, error)\n } else if (context) {\n console.error(`[Stint] ${message}`, context)\n } else {\n console.error(`[Stint] ${message}`)\n }\n },\n}\n\n/**\n * No-op logger that discards all log messages\n * Useful for production environments where logging is not desired\n */\nexport const noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n}\n","import { fromBase64 } from '@cosmjs/encoding'\nimport { PublicKeyCredentialWithPRF } from './types'\nimport { StintError, ErrorCodes } from './errors'\nimport { Logger, noopLogger } from './logger'\n\n// ============================================================================\n// SECURITY UTILITIES\n// ============================================================================\n\n/**\n * Generate time-windowed stint salt for PRF and HKDF\n * Creates unique salt based on domain, user, purpose, and UTC time window\n * Uses Unix epoch-based calculation to handle arbitrary window sizes\n */\nfunction generateStintSalt(\n userAddress: string,\n purpose: string,\n windowHours: number = 24,\n windowNumber?: number\n): string {\n // Use UTC milliseconds since Unix epoch for global synchronization\n const now = Date.now()\n const windowMs = windowHours * 60 * 60 * 1000\n const calculatedWindowNumber = windowNumber ?? Math.floor(now / windowMs)\n\n const domain = window.location.hostname\n return `${domain}:${userAddress}:${purpose}:${calculatedWindowNumber}`\n}\n\n/**\n * Get the current window boundaries for debugging and validation\n * @param windowHours The window size in hours\n * @returns Object with start and end timestamps of current window\n */\nexport function getWindowBoundaries(windowHours: number = 24): {\n start: Date\n end: Date\n windowNumber: number\n} {\n const now = Date.now()\n const windowMs = windowHours * 60 * 60 * 1000\n const windowNumber = Math.floor(now / windowMs)\n\n return {\n start: new Date(windowNumber * windowMs),\n end: new Date((windowNumber + 1) * windowMs),\n windowNumber,\n }\n}\n\n/**\n * Validate and get secure RP ID\n */\nfunction getSecureRpId(): string {\n const hostname = window.location.hostname\n\n // Allow localhost, IP addresses, and valid domain names\n if (\n !hostname ||\n hostname === 'localhost' ||\n /^[\\d.]+$/.test(hostname) ||\n /^[a-zA-Z0-9.-]+$/.test(hostname)\n ) {\n return hostname\n }\n\n throw new StintError('Invalid hostname for WebAuthn', ErrorCodes.WEBAUTHN_NOT_SUPPORTED, {\n hostname,\n })\n}\n\n/**\n * HKDF-SHA256 key derivation function using WebCrypto API\n * @param ikm Input Key Material (PRF output)\n * @param salt Salt for extraction phase\n * @param info Context information for expansion\n * @param length Output length in bytes\n */\nasync function hkdf(\n ikm: Uint8Array,\n salt: Uint8Array,\n info: Uint8Array,\n length: number\n): Promise<Uint8Array> {\n // Import the input key material\n const key = await crypto.subtle.importKey('raw', ikm.buffer as ArrayBuffer, 'HKDF', false, [\n 'deriveBits',\n ])\n\n // Derive bits using HKDF-SHA256\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: salt.buffer as ArrayBuffer,\n info: info.buffer as ArrayBuffer,\n },\n key,\n length * 8 // Convert bytes to bits\n )\n\n return new Uint8Array(derivedBits)\n}\n\n// Public interfaces\nexport interface DerivedKey {\n credentialId: string\n privateKey: Uint8Array // Private key bytes\n}\n\nexport interface PasskeyConfig {\n address: string // Cosmos address as userID\n displayName?: string // Optional display name\n saltName?: string // Salt for key derivation (default: 'stint-session')\n stintWindowHours?: number // Time window in hours for key validity (default: 24, supports any duration)\n windowNumber?: number // Specific window number to use (optional, for grace period logic)\n logger?: Logger // Optional logger\n}\n\n/**\n * Get or create a derived key from passkey for the current domain\n * - Checks for existing passkey with PRF support\n * - Creates new one if none exists or PRF not supported\n * - Returns derived private key\n */\nexport async function getOrCreateDerivedKey(options: PasskeyConfig): Promise<DerivedKey> {\n const logger = options.logger || noopLogger\n const purpose = options.saltName || 'stint-session'\n const windowHours = options.stintWindowHours || 24\n\n // Generate time-windowed stint salt\n const stintSalt = generateStintSalt(options.address, purpose, windowHours, options.windowNumber)\n\n logger.debug('Starting passkey derivation', {\n address: options.address.slice(0, 10) + '...',\n purpose,\n windowHours,\n stintSalt,\n })\n\n if (!window.PublicKeyCredential) {\n logger.error('WebAuthn not supported in this browser')\n throw new StintError('WebAuthn not supported', ErrorCodes.WEBAUTHN_NOT_SUPPORTED, {\n userAgent: navigator.userAgent,\n })\n }\n\n // First, try to get existing credential\n let existingCredential: ExistingCredential | null = null\n\n try {\n existingCredential = await getExistingPasskey(options.address, stintSalt, logger)\n } catch (error) {\n // If user cancelled during existing passkey check, don't proceed to create\n if (\n error instanceof Error &&\n (error.name === 'NotAllowedError' || error.name === 'AbortError')\n ) {\n logger.warn('User cancelled passkey operation')\n throw new StintError('Passkey operation cancelled', ErrorCodes.USER_CANCELLED, {\n operation: 'getExisting',\n error: error.message,\n })\n }\n // Otherwise, no existing credential found, continue to create\n logger.debug('No existing passkey found, will create new one')\n }\n\n // If we found an existing credential, try to use it\n if (existingCredential) {\n logger.debug('Found existing passkey')\n\n if (existingCredential.prfSupported && existingCredential.prfOutput) {\n // Use the PRF output we already got to derive the private key with HKDF\n const saltBytes = new TextEncoder().encode(stintSalt)\n const infoBytes = new TextEncoder().encode('stint-key-derivation')\n const privateKey = await hkdf(existingCredential.prfOutput, saltBytes, infoBytes, 32)\n logger.debug('Session key ready')\n return {\n credentialId: existingCredential.credentialId,\n privateKey,\n }\n } else if (existingCredential.prfSupported) {\n try {\n const privateKey = await derivePrivateKey(\n existingCredential.credentialId,\n stintSalt,\n logger\n )\n logger.debug('Session key ready')\n return {\n credentialId: existingCredential.credentialId,\n privateKey,\n }\n } catch (error) {\n // If deriving the private key fails, we need to create a new passkey\n // This could happen if the user cancels the authentication or there's a timeout\n if (\n error instanceof Error &&\n (error.name === 'NotAllowedError' || error.name === 'AbortError')\n ) {\n logger.warn('User cancelled existing passkey authentication')\n throw new StintError(\n 'Authentication with existing passkey was cancelled',\n ErrorCodes.PASSKEY_AUTHENTICATION_FAILED,\n { operation: 'derivePrivateKey', error: error.message }\n )\n }\n // For other errors, we'll fall through to create a new passkey\n logger.warn('Failed to derive key from existing passkey, will create new one', {\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n }\n } else {\n logger.error('Existing passkey does not support PRF extension')\n throw new StintError(\n 'Existing passkey does not support PRF extension',\n ErrorCodes.PRF_NOT_SUPPORTED,\n { suggestion: 'Please delete the existing passkey for this site and create a new one' }\n )\n }\n }\n\n // Create new passkey\n logger.debug('Creating new passkey')\n const credential = await createPasskey(\n {\n userName: options.address,\n userDisplayName: options.displayName || `Stint: ${options.address.slice(0, 10)}...`,\n },\n logger\n )\n\n const privateKey = await derivePrivateKey(credential.id, stintSalt, logger)\n\n logger.debug('Session key ready')\n return {\n credentialId: credential.id,\n privateKey,\n }\n}\n\n// Internal interfaces\ninterface InternalPasskeyConfig {\n userName: string\n userDisplayName: string\n}\n\ninterface ExistingCredential {\n credentialId: string\n prfSupported: boolean\n prfOutput?: Uint8Array // Include PRF output if available\n}\n\n// Check for existing passkey with PRF support\nasync function getExistingPasskey(\n address: string,\n stintSalt: string,\n logger: Logger = noopLogger\n): Promise<ExistingCredential | null> {\n const challenge = crypto.getRandomValues(new Uint8Array(32)).buffer as ArrayBuffer\n\n try {\n const publicKeyCredentialRequestOptions: PublicKeyCredentialRequestOptions = {\n challenge,\n rpId: getSecureRpId(),\n userVerification: 'required',\n allowCredentials: [], // Let user select any credential for this domain\n timeout: 60000, // 60 seconds for authentication\n extensions: {\n prf: {\n eval: {\n first: new TextEncoder().encode(stintSalt + '\\x00').buffer as ArrayBuffer,\n second: new TextEncoder().encode(stintSalt + '\\x01').buffer as ArrayBuffer,\n },\n },\n },\n }\n\n const assertion = (await navigator.credentials.get({\n publicKey: publicKeyCredentialRequestOptions,\n })) as PublicKeyCredentialWithPRF | null\n\n if (!assertion) {\n return null\n }\n\n // Validate that the passkey belongs to the expected address\n const userHandle = (assertion.response as any).userHandle as ArrayBuffer | null\n if (userHandle) {\n const userIdFromPasskey = new TextDecoder().decode(userHandle)\n if (userIdFromPasskey !== address) {\n logger.debug('Passkey user ID does not match current address', {\n expected: address,\n actual: userIdFromPasskey,\n })\n return null\n }\n } else {\n // If no userHandle is present, we can't validate the address\n logger.debug('Passkey has no userHandle, cannot validate address')\n return null\n }\n\n // Check if PRF extension is supported and extract output\n const clientExtensionResults = assertion.getClientExtensionResults()\n const prfResult1 = clientExtensionResults.prf?.results?.first\n const prfResult2 = clientExtensionResults.prf?.results?.second\n const prfSupported = !!prfResult1\n\n let prfOutput: Uint8Array | undefined\n if (prfResult1) {\n // Convert first result to Uint8Array\n let output1: Uint8Array\n if (prfResult1 instanceof ArrayBuffer) {\n output1 = new Uint8Array(prfResult1)\n } else {\n output1 = new Uint8Array(prfResult1)\n }\n\n // Convert second result to Uint8Array (if available)\n let output2: Uint8Array\n if (prfResult2) {\n if (prfResult2 instanceof ArrayBuffer) {\n output2 = new Uint8Array(prfResult2)\n } else {\n output2 = new Uint8Array(prfResult2)\n }\n } else {\n // If second output is not available, use first output again\n output2 = output1\n }\n\n // Combine both outputs for maximum entropy\n const combinedOutput = new Uint8Array(output1.length + output2.length)\n combinedOutput.set(output1)\n combinedOutput.set(output2, output1.length)\n prfOutput = combinedOutput\n }\n\n return {\n credentialId: assertion.id,\n prfSupported,\n prfOutput,\n }\n } catch (error) {\n if (error instanceof Error) {\n // Check for specific WebAuthn errors that might indicate domain/credential issues\n if (error.name === 'NotAllowedError') {\n logger.debug('User cancelled passkey authentication or invalid credential for domain', {\n error: error.message,\n suggestion: 'This might be due to selecting a passkey from a different domain',\n })\n } else if (error.name === 'SecurityError') {\n logger.debug('Security error during passkey authentication', {\n error: error.message,\n suggestion: 'This might be due to domain mismatch or invalid RP ID',\n })\n } else {\n logger.debug('Passkey authentication failed', {\n error: error.message,\n errorType: error.name,\n })\n }\n } else {\n logger.debug('Unknown error during passkey authentication', {\n error: 'Unknown error',\n })\n }\n return null\n }\n}\n\n// Create a new passkey credential with PRF extension\nasync function createPasskey(\n options: InternalPasskeyConfig,\n logger: Logger = noopLogger\n): Promise<PublicKeyCredential> {\n const challenge = crypto.getRandomValues(new Uint8Array(32)).buffer as ArrayBuffer\n\n const publicKeyCredentialCreationOptions: PublicKeyCredentialCreationOptions = {\n challenge,\n rp: {\n id: getSecureRpId(),\n name: 'Stint Session Signer',\n },\n user: {\n id: new TextEncoder().encode(options.userName),\n name: options.userName,\n displayName: options.userDisplayName,\n },\n pubKeyCredParams: [\n { alg: -7, type: 'public-key' }, // ES256\n { alg: -257, type: 'public-key' }, // RS256\n ],\n authenticatorSelection: {\n // Remove platform restriction to allow 1Password and other passkey managers\n userVerification: 'required',\n requireResidentKey: false,\n residentKey: 'preferred',\n },\n timeout: 120000,\n attestation: 'none',\n extensions: {\n prf: {},\n },\n }\n\n const credential = (await navigator.credentials.create({\n publicKey: publicKeyCredentialCreationOptions,\n })) as PublicKeyCredentialWithPRF | null\n\n if (!credential) {\n logger.error('Failed to create passkey - credential is null')\n throw new StintError('Failed to create passkey', ErrorCodes.PASSKEY_CREATION_FAILED, {\n reason: 'Credential creation returned null',\n })\n }\n\n // Add a small delay to handle potential race conditions\n await new Promise((resolve) => setTimeout(resolve, 100))\n\n // Verify PRF extension is supported\n const clientExtensionResults = credential.getClientExtensionResults()\n\n // More lenient PRF check - sometimes the 'enabled' flag isn't set but PRF still works\n const prfExtension = clientExtensionResults.prf\n if (!prfExtension) {\n logger.error('Passkey created but PRF extension not enabled')\n throw new StintError(\n 'Passkey created but PRF extension not enabled',\n ErrorCodes.PRF_NOT_SUPPORTED,\n { suggestion: 'Your browser or authenticator may not support the PRF extension' }\n )\n }\n\n return credential\n}\n\n// Get PRF output from passkey\nasync function getPasskeyPRF(\n credentialId: string,\n stintSalt: string,\n logger: Logger = noopLogger\n): Promise<Uint8Array> {\n const challenge = crypto.getRandomValues(new Uint8Array(32)).buffer as ArrayBuffer\n\n // Convert base64url credential ID to bytes\n const base64 = credentialId.replace(/-/g, '+').replace(/_/g, '/')\n const padded = base64 + '==='.slice(0, (4 - (base64.length % 4)) % 4)\n const credentialIdBytes = fromBase64(padded)\n\n const publicKeyCredentialRequestOptions: PublicKeyCredentialRequestOptions = {\n challenge,\n rpId: getSecureRpId(),\n userVerification: 'required', // Require user verification for security\n allowCredentials: [\n {\n id: credentialIdBytes.buffer as ArrayBuffer,\n type: 'public-key',\n },\n ],\n extensions: {\n prf: {\n eval: {\n first: new TextEncoder().encode(stintSalt + '\\x00').buffer as ArrayBuffer,\n second: new TextEncoder().encode(stintSalt + '\\x01').buffer as ArrayBuffer,\n },\n },\n },\n timeout: 60000, // 60 seconds for authentication\n }\n\n const assertion = (await navigator.credentials.get({\n publicKey: publicKeyCredentialRequestOptions,\n })) as PublicKeyCredentialWithPRF | null\n\n if (!assertion) {\n logger.error('Failed to get passkey assertion')\n throw new StintError(\n 'Failed to get passkey assertion',\n ErrorCodes.PASSKEY_AUTHENTICATION_FAILED,\n { operation: 'getPRF' }\n )\n }\n\n const clientExtensionResults = assertion.getClientExtensionResults()\n if (!clientExtensionResults.prf?.results?.first) {\n logger.error('PRF extension not supported or no output')\n throw new StintError('PRF extension not supported or no output', ErrorCodes.PRF_NOT_SUPPORTED, {\n suggestion: 'Your browser or authenticator may not support the PRF extension',\n })\n }\n\n // Handle different possible return types from PRF and combine both outputs\n const prfResult1 = clientExtensionResults.prf.results.first\n const prfResult2 = clientExtensionResults.prf.results.second\n\n // Convert first result to Uint8Array\n let output1: Uint8Array\n if (prfResult1 instanceof ArrayBuffer) {\n output1 = new Uint8Array(prfResult1)\n } else {\n output1 = new Uint8Array(prfResult1)\n }\n\n // Convert second result to Uint8Array (if available)\n let output2: Uint8Array\n if (prfResult2) {\n if (prfResult2 instanceof ArrayBuffer) {\n output2 = new Uint8Array(prfResult2)\n } else {\n output2 = new Uint8Array(prfResult2)\n }\n } else {\n // If second output is not available, use first output again\n output2 = output1\n }\n\n // Combine both outputs for maximum entropy\n const combinedOutput = new Uint8Array(output1.length + output2.length)\n combinedOutput.set(output1)\n combinedOutput.set(output2, output1.length)\n\n return combinedOutput\n}\n\n// Derive a private key from passkey PRF output\nasync function derivePrivateKey(\n credentialId: string,\n stintSalt: string,\n logger: Logger = noopLogger\n): Promise<Uint8Array> {\n const prfOutput = await getPasskeyPRF(credentialId, stintSalt, logger)\n\n // Use HKDF to derive the private key\n const saltBytes = new TextEncoder().encode(stintSalt)\n const infoBytes = new TextEncoder().encode('stint-key-derivation')\n return hkdf(prfOutput, saltBytes, infoBytes, 32)\n}\n","import { DeliverTxResponse, StdFee, isDeliverTxSuccess } from '@cosmjs/stargate'\nimport { EncodeObject } from '@cosmjs/proto-signing'\nimport { Coin } from 'cosmjs-types/cosmos/base/v1beta1/coin'\nimport { Any } from 'cosmjs-types/google/protobuf/any'\nimport { MsgSend } from 'cosmjs-types/cosmos/bank/v1beta1/tx'\nimport { SessionSigner, ExecuteHelpers } from './types'\nimport { StintError, ErrorCodes } from './errors'\nimport { Logger } from './logger'\n\n/**\n * Helper to wrap any message in MsgExec for authz delegation\n */\nexport function wrapInMsgExec(granteeAddress: string, messages: Any[]): EncodeObject {\n const execMsg: EncodeObject = {\n typeUrl: '/cosmos.authz.v1beta1.MsgExec',\n value: {\n grantee: granteeAddress,\n msgs: messages,\n },\n }\n\n return execMsg\n}\n\n/**\n * Create fee object with granter for feegrant usage\n */\nexport function createFeeWithGranter(\n granterAddress: string,\n fee?: StdFee | 'auto'\n): StdFee | 'auto' {\n if (fee === 'auto') {\n return 'auto'\n }\n\n const defaultFee: StdFee = {\n amount: [{ denom: 'uphoton', amount: '5000' }],\n gas: '200000',\n }\n\n const feeWithGranter: StdFee = {\n ...defaultFee,\n ...fee,\n granter: granterAddress,\n }\n\n return feeWithGranter\n}\n\n/**\n * Send tokens using session signer with authz delegation\n */\nexport async function send(\n sessionSigner: SessionSigner,\n params: {\n toAddress: string\n amount: Coin[]\n memo?: string\n fee?: StdFee | 'auto'\n },\n logger: Logger\n): Promise<DeliverTxResponse> {\n const { toAddress, amount, memo = '', fee } = params\n\n logger.info('Executing send with session signer', {\n toAddress,\n amount,\n memo: memo.slice(0, 50) + (memo.length > 50 ? '...' : ''),\n })\n\n // Validate inputs\n if (!toAddress) {\n throw new StintError('Invalid recipient address', ErrorCodes.INVALID_ADDRESS, {\n toAddress,\n })\n }\n\n if (!amount || amount.length === 0) {\n throw new StintError('Invalid amount', ErrorCodes.INVALID_AMOUNT, { amount })\n }\n\n try {\n // Create MsgSend with primary address as sender\n const msgSend = MsgSend.fromPartial({\n fromAddress: sessionSigner.primaryAddress(),\n toAddress,\n amount,\n })\n\n logger.debug('Created MsgSend', {\n fromAddress: sessionSigner.primaryAddress(),\n toAddress,\n amount,\n })\n\n // Encode to bytes\n const msgSendBytes = MsgSend.encode(msgSend).finish()\n\n // Wrap in Any type\n const msgSendAny = Any.fromPartial({\n typeUrl: '/cosmos.bank.v1beta1.MsgSend',\n value: msgSendBytes,\n })\n\n // Wrap in MsgExec\n const execMsg = wrapInMsgExec(sessionSigner.sessionAddress(), [msgSendAny])\n\n // Create fee with granter\n const feeWithGranter = createFeeWithGranter(sessionSigner.primaryAddress(), fee)\n\n logger.debug('Broadcasting transaction...', {\n signer: sessionSigner.sessionAddress(),\n feeGranter: sessionSigner.primaryAddress(),\n fee: feeWithGranter,\n })\n\n // Sign and broadcast\n const result = await sessionSigner.client.signAndBroadcast(\n sessionSigner.sessionAddress(),\n [execMsg],\n feeWithGranter,\n memo\n )\n\n if (!isDeliverTxSuccess(result)) {\n const errorLog = (result as any).rawLog || 'Transaction failed'\n logger.error('Transaction failed on chain', undefined, {\n code: result.code,\n rawLog: errorLog,\n })\n throw new StintError(`Transaction failed: ${errorLog}`, ErrorCodes.INVALID_RESPONSE, {\n code: result.code,\n rawLog: errorLog,\n })\n }\n\n logger.info('Transaction successful', {\n transactionHash: result.transactionHash,\n gasUsed: result.gasUsed,\n gasWanted: result.gasWanted,\n height: result.height,\n })\n\n return result\n } catch (error) {\n if (error instanceof StintError) {\n throw error\n }\n\n logger.error('Failed to execute send', error as Error)\n throw new StintError(\n 'Failed to execute send transaction',\n ErrorCodes.CLIENT_INITIALIZATION_FAILED,\n { error: error instanceof Error ? error.message : String(error) }\n )\n }\n}\n\n/**\n * Execute custom messages with authz delegation\n */\nexport async function custom(\n sessionSigner: SessionSigner,\n params: {\n messages: Any[]\n memo?: string\n fee?: StdFee | 'auto'\n },\n logger: Logger\n): Promise<DeliverTxResponse> {\n const { messages, memo = '', fee } = params\n\n logger.info('Executing custom messages with session signer', {\n messageCount: messages.length,\n memo: memo.slice(0, 50) + (memo.length > 50 ? '...' : ''),\n })\n\n try {\n // Wrap all messages in MsgExec\n const execMsg = wrapInMsgExec(sessionSigner.sessionAddress(), messages)\n\n // Create fee with granter\n const feeWithGranter = createFeeWithGranter(sessionSigner.primaryAddress(), fee)\n\n logger.debug('Broadcasting custom transaction...', {\n signer: sessionSigner.sessionAddress(),\n feeGranter: sessionSigner.primaryAddress(),\n messageCount: messages.length,\n })\n\n // Sign and broadcast\n const result = await sessionSigner.client.signAndBroadcast(\n sessionSigner.sessionAddress(),\n [execMsg],\n feeWithGranter,\n memo\n )\n\n if (!isDeliverTxSuccess(result)) {\n const errorLog = (result as any).rawLog || 'Transaction failed'\n logger.error('Transaction failed on chain', undefined, {\n code: result.code,\n rawLog: errorLog,\n })\n throw new StintError(`Transaction failed: ${errorLog}`, ErrorCodes.INVALID_RESPONSE, {\n code: result.code,\n rawLog: errorLog,\n })\n }\n\n logger.info('Custom transaction successful', {\n transactionHash: result.transactionHash,\n gasUsed: result.gasUsed,\n gasWanted: result.gasWanted,\n height: result.height,\n })\n\n return result\n } catch (error) {\n if (error instanceof StintError) {\n throw error\n }\n\n logger.error('Failed to execute custom messages', error as Error)\n throw new StintError(\n 'Failed to execute custom transaction',\n ErrorCodes.CLIENT_INITIALIZATION_FAILED,\n { error: error instanceof Error ? error.message : String(error) }\n )\n }\n}\n\n/**\n * Create execute helper methods for a SessionSigner\n * This abstracts away the complexity of MsgExec wrapping for authz delegation\n */\nexport function createExecuteHelpers(sessionSigner: SessionSigner, logger: Logger): ExecuteHelpers {\n return {\n send: (params) => send(sessionSigner, params, logger),\n custom: (params) => custom(sessionSigner, params, logger),\n }\n}\n","import { SigningStargateClient, GasPrice } from '@cosmjs/stargate'\nimport { DirectSecp256k1Wallet, EncodeObject } from '@cosmjs/proto-signing'\nimport { Coin } from 'cosmjs-types/cosmos/base/v1beta1/coin'\nimport { Timestamp } from 'cosmjs-types/google/protobuf/timestamp'\nimport { SendAuthorization } from 'cosmjs-types/cosmos/bank/v1beta1/authz'\nimport { BasicAllowance } from 'cosmjs-types/cosmos/feegrant/v1beta1/feegrant'\nimport { Any } from 'cosmjs-types/google/protobuf/any'\nimport {\n SessionSigner,\n SessionSignerConfig,\n AuthzGrantInfo,\n FeegrantInfo,\n DelegationConfig,\n SigningStargateClientWithSigner,\n} from './types'\nimport { getOrCreateDerivedKey } from './passkey'\nimport { StintError, ErrorCodes } from './errors'\nimport { Logger, noopLogger } from './logger'\nimport { createExecuteHelpers } from './execute'\n\n// ============================================================================\n// SESSION SIGNER CREATION\n// ============================================================================\n\n/**\n * Create a complete session signer in one step\n * Combines passkey creation, signer derivation, and chain connection\n * @param config - Configuration with primary client and optional salt name\n * @returns Initialized SessionSigner ready for use\n */\nexport async function newSessionSigner(config: SessionSignerConfig): Promise<SessionSigner> {\n const logger = config.logger || noopLogger\n\n logger.debug('Initializing session signer', { saltName: config.saltName })\n\n // Type assertion to our extended interface\n const extendedClient = config.primaryClient as unknown as SigningStargateClientWithSigner\n\n // Extract the signer from the client and get accounts\n const primarySigner = extendedClient.signer\n if (!primarySigner) {\n logger.error('Failed to extract signer from primary client')\n throw new StintError(\n 'Failed to initialize session signer',\n ErrorCodes.SIGNER_EXTRACTION_FAILED,\n { reason: 'Signer not available in primary client' }\n )\n }\n\n const primaryAccounts = await primarySigner.getAccounts()\n const primaryAddress = primaryAccounts[0].address\n\n // Extract prefix from primary address (e.g., 'atone' from 'atone1...')\n const prefix = primaryAddress.match(/^([a-z]+)1/)?.[1] || 'atom'\n\n // Calculate window number based on simple selection\n const windowHours = config.stintWindowHours || 24\n const now = Date.now()\n const windowMs = windowHours * 60 * 60 * 1000\n const currentWindow = Math.floor(now / windowMs)\n const windowNumber = config.usePreviousWindow ? currentWindow - 1 : currentWindow\n\n logger.debug('Creating session signer', {\n windowNumber,\n windowHours,\n usePreviousWindow: config.usePreviousWindow || false,\n keyMode: config.keyMode || 'passkey',\n })\n\n // Get or create key based on mode\n let privateKey: Uint8Array\n\n if (config.keyMode === 'random') {\n // Random mode: generate ephemeral key\n logger.debug('Generating new random session key')\n logger.warn('Random session key generated - will not persist across page refresh')\n privateKey = crypto.getRandomValues(new Uint8Array(32))\n } else {\n // Passkey mode (default): derive from passkey\n const derivedKey = await getOrCreateDerivedKey({\n address: primaryAddress,\n displayName: `Stint: ${primaryAddress.slice(0, 10)}...`,\n saltName: config.saltName || 'stint-session',\n stintWindowHours: windowHours,\n windowNumber,\n logger,\n })\n privateKey = derivedKey.privateKey\n }\n\n // Create the session signer from the private key with same prefix as primary\n const sessionSigner = await DirectSecp256k1Wallet.fromKey(privateKey, prefix)\n\n // Get the session signer address\n const sessionAccounts = await sessionSigner.getAccounts()\n const sessionAddress = sessionAccounts[0].address\n\n // Extract RPC URL from the primary client's cometClient\n const rpcUrl = extendedClient.cometClient?.client?.url\n if (!rpcUrl) {\n logger.error('Failed to extract RPC URL from primary client')\n throw new StintError(\n 'Failed to initialize session signer',\n ErrorCodes.RPC_URL_EXTRACTION_FAILED,\n { reason: 'RPC URL not available in primary client' }\n )\n }\n\n // Create a new client for the session signer using the same RPC endpoint as primary\n // Ensure we use a proper GasPrice object\n const originalGasPrice = extendedClient.gasPrice\n let gasPrice: GasPrice\n\n if (originalGasPrice instanceof GasPrice) {\n gasPrice = originalGasPrice\n } else if (\n originalGasPrice &&\n typeof originalGasPrice === 'object' &&\n 'denom' in originalGasPrice &&\n 'amount' in originalGasPrice\n ) {\n // Convert object format to proper GasPrice\n gasPrice = GasPrice.fromString(`${originalGasPrice.amount}${originalGasPrice.denom}`)\n } else {\n // Default fallback\n gasPrice = GasPrice.fromString('0.025uphoton')\n }\n\n const client = await SigningStargateClient.connectWithSigner(rpcUrl, sessionSigner, {\n gasPrice,\n })\n\n const signer: SessionSigner = {\n primarySigner,\n sessionSigner,\n client,\n\n // Methods - now synchronous with cached addresses\n primaryAddress: (): string => {\n return primaryAddress\n },\n\n sessionAddress: (): string => {\n return sessionAddress\n },\n\n // Methods - created by factory functions\n hasAuthzGrant: createHasAuthzGrant(\n config.primaryClient,\n primaryAddress,\n sessionAddress,\n logger\n ),\n hasFeegrant: createHasFeegrant(config.primaryClient, primaryAddress, sessionAddress, logger),\n\n // Methods - message generation (implemented inline)\n generateDelegationMessages: (config: DelegationConfig) =>\n generateDelegationMessagesFn(primaryAddress, sessionAddress, config),\n generateConditionalDelegationMessages: async (config: DelegationConfig) =>\n generateConditionalDelegationMessagesFn(signer, config),\n revokeDelegationMessages: (msgTypeUrl?: string) =>\n revokeDelegationMessagesFn(primaryAddress, sessionAddress, msgTypeUrl),\n\n // Execute helpers - will be added after signer creation\n execute: null as any,\n }\n\n // Add execute helpers after signer is created (needs reference to signer)\n signer.execute = createExecuteHelpers(signer, logger)\n\n return signer\n}\n\n// ============================================================================\n// URL UTILITIES\n// ============================================================================\n\n/**\n * Securely convert RPC URL to REST API URL\n * @param rpcUrl The RPC URL to convert\n * @returns REST API URL\n * @throws StintError if URL is invalid or malformed\n */\nexport function convertRpcToRestUrl(rpcUrl: string): string {\n try {\n const url = new globalThis.URL(rpcUrl)\n\n // Validate protocol\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('Invalid protocol: only http/https allowed')\n }\n\n // Convert RPC port to REST port\n if (url.port === '26657') {\n url.port = '1317'\n }\n\n // Convert RPC subdomain to API subdomain\n if (url.hostname.startsWith('rpc.')) {\n url.hostname = url.hostname.replace('rpc.', 'api.')\n }\n\n // Handle AtomOne testnet specific pattern: *-rpc.* -> *-api.*\n if (url.hostname.includes('-rpc.')) {\n url.hostname = url.hostname.replace('-rpc.', '-api.')\n }\n\n // Return URL without trailing slash to avoid double slashes\n const urlString = url.toString()\n return urlString.endsWith('/') ? urlString.slice(0, -1) : urlString\n } catch (error) {\n throw new StintError('Invalid RPC URL provided', ErrorCodes.INVALID_RPC_URL, {\n rpcUrl,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n }\n}\n\n// ============================================================================\n// GRANT CHECKING FACTORY FUNCTIONS\n// ============================================================================\n\n// Type aliases for clarity\ntype HasAuthzGrantFn = (messageType?: string) => Promise<AuthzGrantInfo | null>\ntype HasFeegrantFn = () => Promise<FeegrantInfo | null>\n\n// Factory function for hasAuthzGrant method\nfunction createHasAuthzGrant(\n primaryClient: SigningStargateClient,\n primaryAddress: string,\n sessionAddress: string,\n logger: Logger = noopLogger\n): HasAuthzGrantFn {\n return async (\n messageType: string = '/cosmos.bank.v1beta1.MsgSend'\n ): Promise<AuthzGrantInfo | null> => {\n try {\n const extendedClient = primaryClient as unknown as SigningStargateClientWithSigner\n const rpcUrl = extendedClient.cometClient?.client?.url\n if (!rpcUrl) {\n logger.warn('Could not extract RPC URL for authz grant check')\n return null\n }\n\n const restUrl = convertRpcToRestUrl(rpcUrl)\n const requestUrl = `${restUrl}/cosmos/authz/v1beta1/grants?granter=${primaryAddress}&grantee=${sessionAddress}&msg_type_url=${messageType}`\n\n logger.debug('Checking authz grant', {\n rpcUrl,\n restUrl,\n requestUrl,\n granter: primaryAddress,\n grantee: sessionAddress,\n messageType,\n })\n\n const response = await fetch(requestUrl, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'User-Agent': 'stint-library/1.0.0',\n },\n signal: globalThis.AbortSignal.timeout(10000), // 10 second timeout\n // Security: Only allow specific response types\n redirect: 'error', // Don't follow redirects for security\n })\n\n if (!response.ok) {\n logger.debug('Authz grant check failed', {\n status: response.status,\n statusText: response.statusText,\n messageType,\n })\n return null\n }\n\n // Security: Validate response size and content type (only in real fetch environment)\n if (response.headers) {\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > 1024 * 1024) {\n // 1MB limit\n logger.warn('Authz grant response too large', {\n contentLength,\n messageType,\n })\n return null\n }\n\n const contentType = response.headers.get('content-type')\n if (!contentType || !contentType.includes('application/json')) {\n logger.warn('Invalid content type for authz grant response', {\n contentType,\n messageType,\n })\n return null\n }\n }\n\n const data = await response.json()\n logger.debug('Authz grant response', { data, messageType })\n\n if (!data.grants || data.grants.length === 0) {\n logger.debug('No authz grants found', { messageType })\n return null\n }\n\n const grant = data.grants[0]\n logger.debug('Found authz grant', { messageType, hasExpiration: !!grant.expiration })\n return {\n authorization: grant.authorization,\n expiration: grant.expiration ? new Date(grant.expiration) : undefined,\n }\n } catch (error) {\n // Handle specific error types for better debugging\n if (error instanceof globalThis.DOMException && error.name === 'TimeoutError') {\n logger.warn('Authz grant check timed out', {\n operation: 'hasAuthzGrant',\n messageType,\n timeout: '10000ms',\n })\n } else if (error instanceof TypeError && error.message.includes('fetch')) {\n logger.warn('Network error during authz grant check', {\n operation: 'hasAuthzGrant',\n messageType,\n error: error.message,\n })\n } else {\n logger.warn('Authz grant check failed', {\n operation: 'hasAuthzGrant',\n messageType,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n }\n return null\n }\n }\n}\n\n// Factory function for hasFeegrant method\nfunction createHasFeegrant(\n primaryClient: SigningStargateClient,\n primaryAddress: string,\n sessionAddress: string,\n logger: Logger = noopLogger\n): HasFeegrantFn {\n return async (): Promise<FeegrantInfo | null> => {\n try {\n const extendedClient = primaryClient as unknown as SigningStargateClientWithSigner\n const rpcUrl = extendedClient.cometClient?.client?.url\n if (!rpcUrl) {\n logger.warn('Could not extract RPC URL for feegrant check')\n return null\n }\n\n const restUrl = convertRpcToRestUrl(rpcUrl)\n const requestUrl = `${restUrl}/cosmos/feegrant/v1beta1/allowance/${primaryAddress}/${sessionAddress}`\n\n logger.debug('Checking feegrant', {\n rpcUrl,\n restUrl,\n requestUrl,\n granter: primaryAddress,\n grantee: sessionAddress,\n })\n\n const response = await fetch(requestUrl, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'User-Agent': 'stint-library/1.0.0',\n },\n signal: globalThis.AbortSignal.timeout(10000), // 10 second timeout\n // Security: Only allow specific response types\n redirect: 'error', // Don't follow redirects for security\n })\n\n if (!response.ok) {\n logger.debug('Feegrant check failed', {\n status: response.status,\n statusText: response.statusText,\n })\n return null\n }\n\n // Security: Validate response size and content type (only in real fetch environment)\n if (response.headers) {\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > 1024 * 1024) {\n // 1MB limit\n logger.warn('Feegrant response too large', {\n contentLength,\n })\n return null\n }\n\n const contentType = response.headers.get('content-type')\n if (!contentType || !contentType.includes('application/json')) {\n logger.warn('Invalid content type for feegrant response', {\n contentType,\n })\n return null\n }\n }\n\n const data = await response.json()\n if (!data.allowance) {\n logger.debug('No feegrant found')\n return null\n }\n\n logger.debug('Found feegrant', { hasExpiration: !!data.allowance.expiration })\n return {\n allowance: data.allowance,\n expiration: data.allowance.expiration ? new Date(data.allowance.expiration) : undefined,\n }\n } catch (error) {\n // Handle specific error types for better debugging\n if (error instanceof globalThis.DOMException && error.name === 'TimeoutError') {\n logger.warn('Feegrant check timed out', {\n operation: 'hasFeegrant',\n timeout: '10000ms',\n })\n } else if (error instanceof TypeError && error.message.includes('fetch')) {\n logger.warn('Network error during feegrant check', {\n operation: 'hasFeegrant',\n error: error.message,\n })\n } else {\n logger.warn('Feegrant check failed', {\n operation: 'hasFeegrant',\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n }\n return null\n }\n }\n}\n\n// ============================================================================\n// AUTHZ AND FEEGRANT UTILITIES\n// ============================================================================\n\n// Convert Date to protobuf Timestamp\nexport function dateToTimestamp(date: Date): Timestamp {\n return Timestamp.fromPartial({\n seconds: BigInt(Math.floor(date.getTime() / 1000)),\n nanos: (date.getTime() % 1000) * 1_000_000,\n })\n}\n\n// Generate authz grant and feegrant messages for session signer delegation\nfunction generateDelegationMessagesFn(\n primaryAddress: string,\n sessionAddress: string,\n config: DelegationConfig\n): EncodeObject[] {\n // Primary address grants session address limited send authorization\n const spendLimitCoins: Coin[] = config.spendLimit\n ? [Coin.fromPartial({ denom: config.spendLimit.denom, amount: config.spendLimit.amount })]\n : [Coin.fromPartial({ denom: 'uphoton', amount: '10000000' })] // Default 10 PHOTON limit\n\n // Create send authorization with proper protobuf encoding\n const sendAuth = SendAuthorization.fromPartial({\n spendLimit: spendLimitCoins,\n allowList: config.allowedRecipients || [],\n })\n\n const authorization = Any.fromPartial({\n typeUrl: '/cosmos.bank.v1beta1.SendAuthorization',\n value: SendAuthorization.encode(sendAuth).finish(),\n })\n\n // Create authz grant message with proper encoding\n const expirationDate = config.sessionExpiration || new Date(Date.now() + 24 * 60 * 60 * 1000) // Default 24 hours\n const authzGrant = {\n granter: primaryAddress,\n grantee: sessionAddress,\n grant: {\n authorization,\n expiration: dateToTimestamp(expirationDate),\n },\n }\n\n // Primary address grants session address fee allowance\n const gasLimitCoins: Coin[] = config.gasLimit\n ? [Coin.fromPartial({ denom: config.gasLimit.denom, amount: config.gasLimit.amount })]\n : [Coin.fromPartial({ denom: 'uphoton', amount: '10000000' })] // Default 10 PHOTON for gas\n\n // Create feegrant message with proper protobuf encoding\n const allowance = BasicAllowance.fromPartial({\n spendLimit: gasLimitCoins,\n expiration: config.sessionExpiration ? dateToTimestamp(config.sessionExpiration) : undefined,\n })\n\n const feeAllowance = Any.fromPartial({\n typeUrl: '/cosmos.feegrant.v1beta1.BasicAllowance',\n value: BasicAllowance.encode(allowance).finish(),\n })\n\n const feegrant = {\n granter: primaryAddress,\n grantee: sessionAddress,\n allowance: feeAllowance,\n }\n\n return [\n {\n typeUrl: '/cosmos.authz.v1beta1.MsgGrant',\n value: authzGrant,\n },\n {\n typeUrl: '/cosmos.feegrant.v1beta1.MsgGrantAllowance',\n value: feegrant,\n },\n ]\n}\n\n// Generate revocation messages for authz and feegrant\nfunction revokeDelegationMessagesFn(\n primaryAddress: string,\n sessionAddress: string,\n msgTypeUrl: string = '/cosmos.bank.v1beta1.MsgSend'\n): EncodeObject[] {\n return [\n {\n typeUrl: '/cosmos.authz.v1beta1.MsgRevoke',\n value: {\n granter: primaryAddress,\n grantee: sessionAddress,\n msgTypeUrl,\n },\n },\n {\n typeUrl: '/cosmos.feegrant.v1beta1.MsgRevokeAllowance',\n value: {\n granter: primaryAddress,\n grantee: sessionAddress,\n },\n },\n ]\n}\n\n// Generate delegation messages only for missing grants\nasync function generateConditionalDelegationMessagesFn(\n sessionSigner: SessionSigner,\n config: DelegationConfig\n): Promise<EncodeObject[]> {\n const primaryAddress = sessionSigner.primaryAddress()\n const sessionAddress = sessionSigner.sessionAddress()\n\n // Check what grants already exist\n const [existingAuthz, existingFeegrant] = await Promise.all([\n sessionSigner.hasAuthzGrant(),\n sessionSigner.hasFeegrant(),\n ])\n\n const messages: EncodeObject[] = []\n\n // Only create authz grant if it doesn't exist\n if (!existingAuthz) {\n const spendLimitCoins: Coin[] = config.spendLimit\n ? [Coin.fromPartial({ denom: config.spendLimit.denom, amount: config.spendLimit.amount })]\n : [Coin.fromPartial({ denom: 'uphoton', amount: '10000000' })] // Default 10 PHOTON limit\n\n const sendAuth = SendAuthorization.fromPartial({\n spendLimit: spendLimitCoins,\n allowList: config.allowedRecipients || [],\n })\n\n const authorization = Any.fromPartial({\n typeUrl: '/cosmos.bank.v1beta1.SendAuthorization',\n value: SendAuthorization.encode(sendAuth).finish(),\n })\n\n const expirationDate = config.sessionExpiration || new Date(Date.now() + 24 * 60 * 60 * 1000)\n const authzGrant = {\n granter: primaryAddress,\n grantee: sessionAddress,\n grant: {\n authorization,\n expiration: dateToTimestamp(expirationDate),\n },\n }\n\n messages.push({\n typeUrl: '/cosmos.authz.v1beta1.MsgGrant',\n value: authzGrant,\n })\n }\n\n // Only create feegrant if it doesn't exist\n if (!existingFeegrant) {\n const gasLimitCoins: Coin[] = config.gasLimit\n ? [Coin.fromPartial({ denom: config.gasLimit.denom, amount: config.gasLimit.amount })]\n : [Coin.fromPartial({ denom: 'uphoton', amount: '10000000' })] // Default 10 PHOTON for gas\n\n const allowance = BasicAllowance.fromPartial({\n spendLimit: gasLimitCoins,\n expiration: config.sessionExpiration ? dateToTimestamp(config.sessionExpiration) : undefined,\n })\n\n const feeAllowance = Any.fromPartial({\n typeUrl: '/cosmos.feegrant.v1beta1.BasicAllowance',\n value: BasicAllowance.encode(allowance).finish(),\n })\n\n const feegrant = {\n granter: primaryAddress,\n grantee: sessionAddress,\n allowance: feeAllowance,\n }\n\n messages.push({\n typeUrl: '/cosmos.feegrant.v1beta1.MsgGrantAllowance',\n value: feegrant,\n })\n }\n\n return messages\n}\n"]}