Wallet / Auth·EVM · Solana · Cosmos · Near · Aptos · Sui · Bitcoin · TON
Coin98
Coin98 Super Wallet — multi-chain self-custody wallet (mobile + browser extension) with 140+ chains including EVM, Solana, BNB Chain, Near, Aptos, Sui, Cosmos, TON, Bitcoin, and Viction (formerly TomoChain). Provides the Coin98 Adapter, a connector library that exposes a unified provider over `window.coin98` plus a drop-in connect modal for dApps.
- 01Southeast-Asia consumer dApps
- 02EVM + Solana + Cosmos multi-chain UIs
- 03Viction (TomoChain) / Near integrations
- 04drop-in connect modal alternative to WalletConnect
- 05fiat on-ramp + swap UX inside the wallet
- pnpm add @coin98t/wallet-adapter-react @coin98t/wallet-adapter-base
- pnpm add wagmi viem@2.x @tanstack/react-query
| Variable | Scope | Description |
|---|---|---|
| NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID | Client | WalletConnect / Reown Cloud project ID — used for Coin98 mobile flows that fall back to WalletConnect v2. |
Use Coin98 Super Wallet for multi-chain auth. Detect the injected provider via EIP-6963 (`info.rdns === 'coin98.com'`) or fall back to `window.coin98?.provider` (EVM), `window.coin98?.sol` (Solana), `window.coin98?.cosmos`, or `window.coin98?.near`. The legacy `window.ethereum.isCoin98` flag is unreliable when other wallets are installed — always prefer EIP-6963. For a drop-in modal use `@coin98t/wallet-adapter-react`'s `Coin98Provider` and `useWallet()` hook, which auto-handles light/dark theming and exposes `connect()`, `disconnect()`, `signTransaction()`, `signMessage()`. For wagmi v2 use `injected({ target: { id: 'coin98', name: 'Coin98', provider: () => window.coin98?.provider } })`. Coin98 Adapter also wraps non-Coin98 wallets (MetaMask, Phantom, Keplr) under a single hook surface — pass `wallets={[Coin98WalletAdapter, PhantomWalletAdapter, ...]}` to opt into multi-wallet UX.
- ⚑Provider namespace ambiguity: Coin98 historically wrote to both `window.coin98` and `window.ethereum` simultaneously, with `isCoin98: true` on the global — when MetaMask or OKX are co-installed, `window.ethereum` is non-deterministic. Always read `window.coin98.provider` directly or use EIP-6963.
- ⚑Mobile deep-link UX: Coin98's mobile scheme is `coin98://browser?url=...`; iOS Safari blocks programmatic opens — must originate from a user-initiated click, and Telegram/Twitter in-app browsers strip the return path entirely. Prefer WalletConnect v2 for cross-platform reliability.
- ⚑Solana versioned tx support: older Coin98 mobile builds reject v0 (versioned) transactions and only accept legacy ed25519 — feature-detect via `provider.signTransactionV0 === undefined` and downgrade to legacy serialization, or display a wallet-update prompt.
- ⚑Browser extension lifecycle: the Coin98 extension occasionally re-injects on SPA navigations, causing `provider.on('accountsChanged')` listeners attached at module-load to detach silently. Re-bind listeners after each successful `connect()` call.
- ⚑Multi-chain conflicts: switching chains in Coin98 fires `chainChanged` across both EVM and any active Solana session — guard handlers by `chainId` shape (`0x...` hex for EVM vs Solana cluster string) to avoid cross-chain state corruption.
- ⚑Cosmos / Near providers are non-EIP-1193: `window.coin98.cosmos.signAmino(...)` and `window.coin98.near.signAndSendTransaction(...)` use chain-specific RPCs — do not pipe them through wagmi/viem, use chain-native libraries (`@cosmjs/stargate`, `near-api-js`) instead.