UNPKG

stint-signer

Version:

Short-lived, non-custodial session signer using passkeys for Cosmos SDK

1 lines 81.2 kB
{"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"]}