{"version":3,"sources":["../src/hooks/useAbstraxionAccount.ts","../src/components/AbstraxionContext/index.tsx","../src/strategies/index.ts","../src/hooks/useAbstraxionClient.ts","../src/hooks/useAbstraxionSigningClient.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { AbstraxionContext } from \"../components/AbstraxionContext\";\n\nexport interface AbstraxionAccount {\n  bech32Address: string;\n}\n\nexport interface AbstraxionAccountState {\n  data: AbstraxionAccount;\n  isConnected: boolean;\n  isConnecting: boolean;\n  isInitializing: boolean;\n  isLoading: boolean;\n  isReturningFromAuth: boolean;\n  isLoggingIn: boolean;\n  isError: boolean;\n  error: string;\n  login: () => Promise<void>;\n  logout: () => void;\n}\n\nexport const useAbstraxionAccount = (): AbstraxionAccountState => {\n  const {\n    granterAddress,\n    isConnected,\n    isConnecting,\n    isInitializing,\n    isReturningFromAuth,\n    isLoggingIn,\n    abstraxionError,\n    login,\n    logout,\n  } = useContext(AbstraxionContext);\n\n  // isLoading is true if the account is initializing, connecting, or in transition state (isConnecting is true when the user is in login or in callback)\n  const isLoading = isInitializing || isConnecting;\n\n  // isError is true when there's an error message\n  const isError = !!abstraxionError;\n\n  return {\n    data: {\n      bech32Address: granterAddress,\n    },\n    login,\n    logout,\n    isConnected: isConnected,\n    isLoading,\n    isInitializing,\n    isLoggingIn,\n    isConnecting,\n    isReturningFromAuth,\n    isError,\n    error: abstraxionError,\n  };\n};\n","import { createContext, useCallback, useEffect, useState } from \"react\";\nimport { testnetChainInfo, xionGasValues } from \"@burnt-labs/constants\";\nimport { GasPrice } from \"@cosmjs/stargate\";\nimport {\n  AbstraxionAuth,\n  SignArbSecp256k1HdWallet,\n} from \"@burnt-labs/abstraxion-core\";\nimport {\n  ReactNativeRedirectStrategy,\n  ReactNativeStorageStrategy,\n} from \"../../strategies\";\n\nexport const abstraxionAuth = new AbstraxionAuth(\n  new ReactNativeStorageStrategy(),\n  new ReactNativeRedirectStrategy(),\n);\n\nexport type SpendLimit = { denom: string; amount: string };\n\nexport type ContractGrantDescription =\n  | string\n  | {\n      address: string;\n      amounts: SpendLimit[];\n    };\n\nexport interface AbstraxionContextProps {\n  isConnected: boolean;\n  setIsConnected: React.Dispatch<React.SetStateAction<boolean>>;\n  isConnecting: boolean;\n  setIsConnecting: React.Dispatch<React.SetStateAction<boolean>>;\n  isInitializing: boolean;\n  isReturningFromAuth: boolean;\n  isLoggingIn: boolean;\n  abstraxionError: string;\n  setAbstraxionError: React.Dispatch<React.SetStateAction<string>>;\n  abstraxionAccount: SignArbSecp256k1HdWallet | undefined;\n  setAbstraxionAccount: React.Dispatch<SignArbSecp256k1HdWallet | undefined>;\n  granterAddress: string;\n  showModal: boolean;\n  setShowModal: React.Dispatch<React.SetStateAction<boolean>>;\n  setGranterAddress: React.Dispatch<React.SetStateAction<string>>;\n  contracts?: ContractGrantDescription[];\n  dashboardUrl?: string;\n  setDashboardUrl: React.Dispatch<React.SetStateAction<string>>;\n  rpcUrl: string;\n  stake?: boolean;\n  bank?: SpendLimit[];\n  treasury?: string;\n  indexerUrl?: string;\n  gasPrice: GasPrice;\n  logout: () => void;\n  login: () => Promise<void>;\n}\n\nexport interface AbstraxionConfig {\n  contracts?: ContractGrantDescription[];\n  rpcUrl?: string;\n  stake?: boolean;\n  bank?: SpendLimit[];\n  callbackUrl?: string;\n  treasury?: string;\n  indexerUrl?: string;\n  gasPrice?: string;\n}\n\nexport function AbstraxionProvider({\n  children,\n  config: {\n    contracts,\n    rpcUrl = testnetChainInfo.rpc,\n    stake = false,\n    bank,\n    callbackUrl,\n    treasury,\n    indexerUrl,\n    gasPrice,\n  },\n}: {\n  children: React.ReactNode;\n  config: AbstraxionConfig;\n}): JSX.Element {\n  const [abstraxionError, setAbstraxionError] = useState(\"\");\n  const [isConnected, setIsConnected] = useState(false);\n  const [isConnecting, setIsConnecting] = useState(false);\n  const [isInitializing, setIsInitializing] = useState(true); // Start with true, prevents mounting/hydration flash/issues\n  const [isReturningFromAuth, setIsReturningFromAuth] = useState(false);\n  const [isLoggingIn, setIsLoggingIn] = useState(false);\n  const [showModal, setShowModal] = useState(false);\n  const [abstraxionAccount, setAbstraxionAccount] = useState<\n    SignArbSecp256k1HdWallet | undefined\n  >(undefined);\n  const [granterAddress, setGranterAddress] = useState(\"\");\n  const [dashboardUrl, setDashboardUrl] = useState(\"\");\n  let gasPriceDefault: GasPrice;\n  const { gasPrice: gasPriceConstant } = xionGasValues;\n  if (rpcUrl.includes(\"mainnet\")) {\n    gasPriceDefault = GasPrice.fromString(gasPriceConstant);\n  } else {\n    gasPriceDefault = GasPrice.fromString(\"0.001uxion\");\n  }\n\n  const configureInstance = useCallback(() => {\n    abstraxionAuth.configureAbstraxionInstance(\n      rpcUrl,\n      contracts,\n      stake,\n      bank,\n      callbackUrl,\n      treasury,\n      indexerUrl,\n    );\n  }, [rpcUrl, contracts, stake, bank, callbackUrl, treasury, indexerUrl]);\n\n  useEffect(() => {\n    configureInstance();\n  }, [configureInstance]);\n\n  // Set up React state callback for WebBrowser redirect completion\n  useEffect(() => {\n    const redirectStrategy = abstraxionAuth[\"redirectStrategy\"] as any;\n    if (redirectStrategy.setReactStateCallback) {\n      redirectStrategy.setReactStateCallback(\n        (params: { granter?: string | null }) => {\n          if (params.granter) {\n            setIsReturningFromAuth(true);\n            setIsConnecting(true);\n            setIsInitializing(false);\n            setShowModal(true);\n          }\n        },\n      );\n    }\n  }, []);\n\n  useEffect(() => {\n    const unsubscribe = abstraxionAuth.subscribeToAuthStateChange(\n      async (newState: boolean) => {\n        if (newState !== isConnected) {\n          if (newState) {\n            // Only set connecting state if we don't already have account info\n            if (!abstraxionAccount || !granterAddress) {\n              setIsConnecting(true);\n              const account = await abstraxionAuth.getLocalKeypair();\n              const granterAddress = await abstraxionAuth.getGranter();\n              setAbstraxionAccount(account);\n              setGranterAddress(granterAddress);\n              setIsConnected(newState);\n              setIsConnecting(false);\n            } else {\n              setIsConnected(newState);\n            }\n            // Clear login state regardless of account info\n            setIsLoggingIn(false);\n          } else {\n            setIsConnected(newState);\n            setAbstraxionAccount(undefined);\n            setGranterAddress(\"\");\n            // Ensure to clear any active states\n            setIsLoggingIn(false);\n            setIsConnecting(false);\n            setIsReturningFromAuth(false);\n          }\n        }\n      },\n    );\n\n    return () => {\n      unsubscribe?.();\n    };\n  }, [isConnected, abstraxionAuth, abstraxionAccount, granterAddress]);\n\n  const persistAuthenticateState = useCallback(async () => {\n    // Quick check: if we can immediately determine auth state, do so - lowers load time on refresh (never goes into connecting state/flow)\n    const hasLocalKeypair = await abstraxionAuth.getLocalKeypair();\n    const hasGranter = await abstraxionAuth.getGranter();\n\n    if (hasLocalKeypair && hasGranter) {\n      setAbstraxionAccount(hasLocalKeypair);\n      setGranterAddress(hasGranter);\n      setIsConnected(true);\n      setIsInitializing(false);\n      return;\n    }\n\n    // Fallback to full authentication if quick check fails\n    try {\n      await abstraxionAuth.authenticate();\n    } catch (error) {\n      const message =\n        error instanceof Error\n          ? error.message\n          : \"Authentication failed. Please try again.\";\n      setAbstraxionError(message);\n    } finally {\n      // Always end initialization after auth check completes, even if authenticate() throws\n      setIsInitializing(false);\n    }\n  }, [abstraxionAuth]);\n\n  useEffect(() => {\n    const initializeAuth = async () => {\n      // Skip initialization if we're in Auth callback flow\n      if (isReturningFromAuth) {\n        return;\n      }\n\n      if (!isConnecting && !abstraxionAccount && !granterAddress) {\n        await persistAuthenticateState();\n      }\n    };\n\n    initializeAuth();\n  }, [isReturningFromAuth]); // Re-run when Auth detection completes\n\n  async function login() {\n    // User actively logging in, so initialization phase is over\n    setIsInitializing(false);\n\n    // Only login state for people actually clicking Login, not Auth callbacks\n    if (!isReturningFromAuth) {\n      setIsLoggingIn(true);\n    }\n\n    try {\n      await abstraxionAuth.login();\n    } catch (error) {\n      throw error; // Re-throw to allow handling by the caller\n    } finally {\n      setIsLoggingIn(false);\n    }\n  }\n\n  const logout = useCallback(() => {\n    setIsConnected(false);\n    setAbstraxionAccount(undefined);\n    setGranterAddress(\"\");\n    setIsInitializing(false);\n    setIsConnecting(false);\n    setIsReturningFromAuth(false);\n    abstraxionAuth?.logout();\n  }, [abstraxionAuth]);\n\n  return (\n    <AbstraxionContext.Provider\n      value={{\n        isConnected,\n        setIsConnected,\n        isConnecting,\n        setIsConnecting,\n        isInitializing,\n        isReturningFromAuth,\n        isLoggingIn,\n        abstraxionError,\n        setAbstraxionError,\n        abstraxionAccount,\n        setAbstraxionAccount,\n        granterAddress,\n        showModal,\n        setShowModal,\n        setGranterAddress,\n        contracts,\n        dashboardUrl,\n        setDashboardUrl,\n        rpcUrl,\n        stake,\n        bank,\n        treasury,\n        indexerUrl,\n        login,\n        logout,\n        gasPrice: gasPrice ? GasPrice.fromString(gasPrice) : gasPriceDefault,\n      }}\n    >\n      {children}\n    </AbstraxionContext.Provider>\n  );\n}\n\nexport const AbstraxionContext = createContext<AbstraxionContextProps>(\n  {} as AbstraxionContextProps,\n);\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport * as WebBrowser from \"expo-web-browser\";\nimport * as Linking from \"expo-linking\";\nimport { StorageStrategy, RedirectStrategy } from \"@burnt-labs/abstraxion-core\";\n\n/**\n * React Native implementation of the StorageStrategy using AsyncStorage\n */\nexport class ReactNativeStorageStrategy implements StorageStrategy {\n  async getItem(key: string): Promise<string | null> {\n    try {\n      return await AsyncStorage.getItem(key);\n    } catch (error) {\n      console.error(\"AsyncStorage getItem error:\", error);\n      return null;\n    }\n  }\n\n  async setItem(key: string, value: string): Promise<void> {\n    try {\n      await AsyncStorage.setItem(key, value);\n    } catch (error) {\n      console.error(\"AsyncStorage setItem error:\", error);\n    }\n  }\n\n  async removeItem(key: string): Promise<void> {\n    try {\n      await AsyncStorage.removeItem(key);\n    } catch (error) {\n      console.error(\"AsyncStorage removeItem error:\", error);\n    }\n  }\n}\n\n/**\n * React Native implementation of the RedirectStrategy using Expo WebBrowser\n */\nexport class ReactNativeRedirectStrategy implements RedirectStrategy {\n  private redirectCallback?: (params: { granter?: string | null }) => void;\n  private reactStateCallback?: (params: { granter?: string | null }) => void;\n\n  async getCurrentUrl(): Promise<string> {\n    return Linking.createURL(\"\");\n  }\n\n  async redirect(url: string): Promise<void> {\n    try {\n      const result = await WebBrowser.openAuthSessionAsync(\n        url,\n        Linking.createURL(\"\"),\n      );\n\n      if (result.type === \"cancel\" || result.type === \"dismiss\") {\n        throw new Error(\"Authentication session was cancelled\");\n      }\n\n      if (result.type === \"success\" && result.url) {\n        const { queryParams } = Linking.parse(result.url);\n        const params = {\n          granter: queryParams?.granter?.toString() || null,\n        };\n\n        // Call the original callback (this triggers AbstraxionAuth's logic)\n        if (this.redirectCallback) {\n          this.redirectCallback(params);\n        }\n\n        // Also call our React state callback if it exists\n        if (this.reactStateCallback) {\n          this.reactStateCallback(params);\n        }\n      }\n    } catch (error) {\n      console.warn(\"Something went wrong during redirect:\", error);\n      throw error;\n    }\n  }\n\n  async onRedirectComplete(\n    callback: (params: { granter?: string | null }) => void,\n  ): Promise<void> {\n    this.redirectCallback = callback;\n  }\n\n  async removeRedirectHandler(): Promise<void> {\n    this.redirectCallback = undefined;\n  }\n\n  // Method to set up React state callback\n  setReactStateCallback(\n    callback: (params: { granter?: string | null }) => void,\n  ): void {\n    this.reactStateCallback = callback;\n  }\n\n  async getUrlParameter(param: string): Promise<string | null> {\n    try {\n      const url = await Linking.getInitialURL();\n      if (!url) return null;\n      const { queryParams } = Linking.parse(url);\n      return queryParams?.[param]?.toString() || null;\n    } catch (error) {\n      console.error(\"Error getting URL parameter:\", error);\n      return null;\n    }\n  }\n\n  async cleanUrlParameters(paramsToRemove: string[]): Promise<void> {\n    // In React Native, URL parameters are typically handled by the deep linking system\n    // and don't persist in the same way as browser URLs. This method is a no-op\n    // for React Native environments as the parameters are already processed by the\n    // deep linking callback and don't need manual cleanup.\n    return Promise.resolve();\n  }\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport { testnetChainInfo } from \"@burnt-labs/constants\";\nimport { AbstraxionContext } from \"../components/AbstraxionContext\";\nimport { CosmWasmClient } from \"@cosmjs/cosmwasm-stargate\";\n\nexport const useAbstraxionClient = (): {\n  readonly client: CosmWasmClient | undefined;\n} => {\n  const { rpcUrl } = useContext(AbstraxionContext);\n\n  const [abstractClient, setAbstractClient] = useState<\n    CosmWasmClient | undefined\n  >(undefined);\n\n  useEffect(() => {\n    async function getClient() {\n      try {\n        const client = await CosmWasmClient.connect(\n          // Should be set in the context but defaulting here just in case\n          rpcUrl || testnetChainInfo.rpc,\n        );\n\n        setAbstractClient(client);\n      } catch (error) {\n        setAbstractClient(undefined);\n      }\n    }\n\n    getClient();\n  }, [rpcUrl]);\n\n  return {\n    client: abstractClient,\n  } as const;\n};\n","import { useContext, useEffect, useState } from \"react\";\nimport { testnetChainInfo } from \"@burnt-labs/constants\";\nimport {\n  GranteeSignerClient,\n  SignArbSecp256k1HdWallet,\n} from \"@burnt-labs/abstraxion-core\";\nimport {\n  AbstraxionContext,\n  abstraxionAuth,\n} from \"../components/AbstraxionContext\";\n\nexport const useAbstraxionSigningClient = (): {\n  readonly client: GranteeSignerClient | undefined;\n  readonly signArb:\n    | ((signerAddress: string, message: string | Uint8Array) => Promise<string>)\n    | undefined;\n} => {\n  const {\n    isConnected,\n    abstraxionAccount,\n    granterAddress,\n    rpcUrl,\n    gasPrice,\n    treasury,\n  } = useContext(AbstraxionContext);\n  const [signArbWallet, setSignArbWallet] = useState<\n    SignArbSecp256k1HdWallet | undefined\n  >(undefined);\n\n  const [abstractClient, setAbstractClient] = useState<\n    GranteeSignerClient | undefined\n  >(undefined);\n\n  useEffect(() => {\n    async function getSigner() {\n      try {\n        if (!abstraxionAccount) {\n          throw new Error(\"No account found.\");\n        }\n\n        if (!granterAddress) {\n          throw new Error(\"No granter found.\");\n        }\n\n        const granteeAddress = await abstraxionAccount\n          .getAccounts()\n          .then((accounts) => {\n            if (accounts.length === 0) {\n              throw new Error(\"No account found.\");\n            }\n            return accounts[0].address;\n          });\n\n        const directClient = await GranteeSignerClient.connectWithSigner(\n          // Should be set in the context but defaulting here just in case\n          rpcUrl || testnetChainInfo.rpc,\n          abstraxionAccount,\n          {\n            gasPrice,\n            granterAddress,\n            granteeAddress,\n            treasuryAddress: treasury,\n          },\n        );\n\n        const wallet = await abstraxionAuth.getLocalKeypair();\n        if (wallet) {\n          setSignArbWallet(wallet);\n        }\n\n        setAbstractClient(directClient);\n      } catch (error) {\n        setAbstractClient(undefined);\n      }\n    }\n\n    getSigner();\n  }, [isConnected, abstraxionAccount, granterAddress, abstraxionAuth]);\n\n  return {\n    client: abstractClient,\n    signArb: signArbWallet?.signArb,\n  } as const;\n};\n"],"mappings":"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","names":["granterAddress","useContext","useEffect","useState","testnetChainInfo","useContext","useState","useEffect","testnetChainInfo","useContext","useEffect","useState","testnetChainInfo","useContext","useState","useEffect","testnetChainInfo"]}