Skip to main content

Overview

  • Complete provider setup for InterwovenKit with all required dependencies.
  • Two variants: basic setup (no Privy/AutoSign) and AutoSign setup (requires Privy).
  • Use the basic setup unless you need AutoSign or embedded wallet features.

Basic setup

For apps that don’t need AutoSign or embedded wallets.
This setup uses initiaPrivyWalletConnector as a wagmi connector option, but does not require PrivyProvider at runtime.
'use client'

import { PropsWithChildren, useEffect } from 'react'
import { createConfig, http, WagmiProvider } from 'wagmi'
import { mainnet } from 'wagmi/chains'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import {
  initiaPrivyWalletConnector,
  injectStyles,
  InterwovenKitProvider,
  MAINNET,
} from '@initia/interwovenkit-react'
import interwovenKitStyles from '@initia/interwovenkit-react/styles.js'

const wagmiConfig = createConfig({
  connectors: [initiaPrivyWalletConnector],
  chains: [mainnet],
  transports: { [mainnet.id]: http() },
})

const queryClient = new QueryClient()

export default function Providers({ children }: PropsWithChildren) {
  useEffect(() => {
    injectStyles(interwovenKitStyles)
  }, [])

  return (
    <QueryClientProvider client={queryClient}>
      <WagmiProvider config={wagmiConfig}>
        <InterwovenKitProvider {...MAINNET}>{children}</InterwovenKitProvider>
      </WagmiProvider>
    </QueryClientProvider>
  )
}

AutoSign setup (requires Privy)

For apps that need AutoSign or embedded wallet features. Privy is required for AutoSign to work:
'use client'

import { PropsWithChildren, useEffect } from 'react'
import { createConfig, http, WagmiProvider } from 'wagmi'
import { mainnet } from 'wagmi/chains'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import {
  initiaPrivyWalletConnector,
  injectStyles,
  InterwovenKitProvider,
  PRIVY_APP_ID,
} from '@initia/interwovenkit-react'
import interwovenKitStyles from '@initia/interwovenkit-react/styles.js'
import {
  PrivyProvider,
  useCreateWallet,
  useLoginWithSiwe,
  usePrivy,
  useWallets,
} from '@privy-io/react-auth'

const wagmiConfig = createConfig({
  connectors: [initiaPrivyWalletConnector],
  chains: [mainnet],
  transports: { [mainnet.id]: http() },
})

const queryClient = new QueryClient()

function InterwovenKitWrapper({ children }: PropsWithChildren) {
  const privy = usePrivy()
  const siwe = useLoginWithSiwe()
  const { createWallet } = useCreateWallet()
  const { wallets } = useWallets()

  return (
    <InterwovenKitProvider
      privyContext={{ privy, siwe, createWallet, wallets }}
      // Option 1: Use boolean to enable default message types based on chain type
      // - minievm: /minievm.evm.v1.MsgCall
      // - miniwasm: /cosmwasm.wasm.v1.MsgExecuteContract
      // - default: /initia.move.v1.MsgExecute
      enableAutoSign={true}
      // Option 2: Specify exact message types per chain
      // enableAutoSign={{
      //   "interwoven-1": [
      //     "/cosmos.bank.v1beta1.MsgSend",        // Token transfers
      //     "/cosmos.staking.v1beta1.MsgDelegate", // Staking/delegation
      //   ],
      // }}
    >
      {children}
    </InterwovenKitProvider>
  )
}

export default function Providers({ children }: PropsWithChildren) {
  useEffect(() => {
    injectStyles(interwovenKitStyles)
  }, [])

  return (
    <PrivyProvider
      appId="YOUR_PRIVY_APP_ID"
      config={{
        loginMethodsAndOrder: {
          primary: [`privy:${PRIVY_APP_ID}`, 'detected_ethereum_wallets'],
        },
      }}
    >
      <QueryClientProvider client={queryClient}>
        <WagmiProvider config={wagmiConfig}>
          <InterwovenKitWrapper>{children}</InterwovenKitWrapper>
        </WagmiProvider>
      </QueryClientProvider>
    </PrivyProvider>
  )
}

Notes

  • Call injectStyles() once at app startup to avoid duplicate style tags.
  • Privy is required for AutoSign. AutoSign will not work without PrivyProvider and privyContext.
  • Replace YOUR_PRIVY_APP_ID with your own Privy app ID. This is distinct from the imported PRIVY_APP_ID (which is Initia’s shared Privy app ID).
  • The privyContext prop must be passed from within a component that has access to Privy hooks (usePrivy, useLoginWithSiwe, useCreateWallet, useWallets).
  • enableAutoSign configuration:
    • Boolean (true): Enables AutoSign with default message types based on chain type:
      • minievm: /minievm.evm.v1.MsgCall
      • miniwasm: /cosmwasm.wasm.v1.MsgExecuteContract
      • default: /initia.move.v1.MsgExecute
    • Record (Record<string, string[]>): Per-chain allowlist of specific message type URLs. Use this to control exactly which message types can be auto-signed (e.g., MsgSend, MsgDelegate, MsgExecute).
  • Config vs runtime: Both setups use initiaPrivyWalletConnector in wagmi config (config-time), but only the AutoSign setup requires PrivyProvider at runtime. The connector itself does not require Privy runtime unless you need AutoSign or embedded wallet features.