Package Exports
- based-auth
- based-auth/actions
- based-auth/index.css
Readme
basedauth
A React/Next.js authentication and wallet connection kit for Ethereum (wagmi) and Solana, with hooks and context providers for seamless integration.
Features
- Multi-chain wallet connection (Ethereum, Solana)
- Modal and context providers for easy integration
- Hooks for account, balance, contract interaction, and more
- Built-in support for wagmi, Solana wallet adapter, and NextAuth
Installation
yarn add based-authNote: You must also install the required peer dependencies in your app:
react,react-dom@tanstack/react-querynext-authsonnerwagmi,@wagmi/core,@wagmi/connectors@solana/wallet-adapter-react,@solana/wallet-adapter-wallets,@solana/web3.jsbased-shared,based-assets(from your monorepo or npm if published)
Usage
1. Wrap your app with the provider
// _app.tsx or main entry
import { SimpleKitProvider } from "based-auth";
import { supportedChains } from "based-shared/chains";
export default function App({ Component, pageProps }) {
return (
<SimpleKitProvider
chains={supportedChains}
host={process.env.NEXT_PUBLIC_APP_URL}
name="Your App Name"
description="Your app description"
icon="/images/your-app-icon.png" // must be a public URL
projectId={process.env.NEXT_PUBLIC_PROJECT_ID}
>
<Component {...pageProps} />
</SimpleKitProvider>
);
}Required props for SimpleKitProvider:
chains: Array of supported chains (seebased-shared/chains)host: Your app's public URL (e.g.https://your-app.com)name: App name (for wallet metadata)description: App descriptionicon: App icon URL (for wallet metadata)projectId: WalletConnect project ID
2. Use hooks in your components
import {
useAccount,
useAccountBalance,
useTokenBalance,
useSimpleKit,
useDisconnectAccount,
} from "based-auth";
function WalletInfo() {
const { address, network } = useAccount();
const { balance, formatted } = useAccountBalance();
const { disconnectAccount } = useDisconnectAccount();
const { openModal } = useSimpleKit();
return (
<div>
<div>Address: {address}</div>
<div>Network: {network}</div>
<div>Balance: {formatted}</div>
<button onClick={openModal}>Connect Wallet</button>
<button onClick={() => disconnectAccount()}>Disconnect</button>
</div>
);
}3. Modal and UI
The modal for wallet connection is automatically provided by the SimpleKitProvider. Use the useSimpleKit hook to open/close the modal.
4. Contract interaction
import { useWriteContractAsync } from "based-auth";
function MintButton() {
const { writeContractAsync } = useWriteContractAsync();
const handleMint = async () => {
await writeContractAsync({
address: "0xYourContract",
abi: [...],
functionName: "mint",
args: [/* ... */],
value: 0n, // always use bigint for value
});
};
return <button onClick={handleMint}>Mint</button>;
}Note:
useReadContractanduseWriteContractare exported but currently not implemented. UseuseWriteContractAsyncfor contract writes.
Environment Variables
Set the following in your .env:
NEXT_PUBLIC_PROJECT_ID=your_walletconnect_project_id
NEXT_PUBLIC_APP_URL=https://your-app-url.com
AUTH_TRUST_HOST=https://your-app-url.com
AUTH_GOOGLE_ID=...
AUTH_GOOGLE_SECRET=...
AUTH_GITHUB_ID=...
AUTH_GITHUB_SECRET=...
AUTH_TWITTER_ID=...
AUTH_TWITTER_SECRET=...
AUTH_SECRET=...API
Providers
SimpleKitProvider– Main context provider, wraps your app. All props are required.
Hooks
useSimpleKit– Modal controls and contextuseAccount– Current user/account infouseChainInfo– Current chain info (logos, symbols, explorers)useAccountBalance– Native token balanceuseTokenBalance– ERC20/SPL token balanceuseTokenBalanceAsync– Async token balance fetchuseDisconnectAccount– Disconnect walletuseWriteContractAsync– Write to contract (EVM/Solana/social)useReadContract– (stub, not implemented)useWriteContract– (stub, not implemented)
Advanced/Utility Hooks (not exported by default)
useConnectAccount,useSwitchChain,useSignAccount,useSwitchAccount,useBalanceAsync,useTransferAsync(see source for details)
Example
import { useSimpleKit } from "based-auth";
function ConnectButton() {
const { isOpen, openModal, closeModal } = useSimpleKit();
return (
<button onClick={openModal}>
{isOpen ? "Modal Open" : "Connect Wallet"}
</button>
);
}For more advanced usage, see the source code and hooks in src/hooks.tsx.