ToolPack

Security

What the app can and cannot do, how to self-host it, and how to verify a deployment matches the source.

ToolPack is designed to earn trust structurally rather than ask for it. This page states plainly what the app is and is not able to do, and how to run and verify it yourself.

What the app can and cannot do

It can:

  • Read public chain data over the RPC.
  • Build transactions and hand them to your wallet for approval.
  • Compute things locally: hashes, conversions, merkle trees, vanity keys, and signature recovery.

It cannot:

  • Move funds without a signature. Every transaction is signed in your wallet for a specific action; there is no custody and no admin key.
  • Ask for or access the private key or seed phrase of a wallet you connect. The Vanity Address Generator is the one special case: it creates a brand-new private key locally in a Web Worker and displays that generated key to you. It is not sent to a server or saved by the app.
  • Store or transmit your data to a backend. There is no backend or database. See Privacy by design.
  • Auto-sign or bundle hidden actions. Each transaction is a distinct prompt you review.

The residual trust is ordinary and unavoidable: you trust that the frontend you loaded builds the transaction it says it does. The mitigations for that are the code being open source and self-hostable, below.

On-chain actions are irreversible. The app's safety guarantees are about custody and privacy; they do not protect you from approving a transaction with the wrong address or amount. Always review each transaction in your wallet before signing.

Self-hosting

The app is a standard Next.js project and runs anywhere Next.js does. To run your own copy:

  1. Clone the repository (the source link is in the app's header and footer).

  2. Install dependencies with npm:

    pnpm install
  3. Configure environment variables in a .env.local file:

    VariableRequiredPurpose
    NEXT_PUBLIC_REOWN_PROJECT_IDFor wallet featuresReown AppKit project ID, from cloud.reown.com. Without it the app still runs, but wallet connection is disabled and only read-only tools work.
    NEXT_PUBLIC_RPC_URLOptionalOverride the RPC endpoint (for example a dedicated provider). Defaults to the public mainnet RPC.

    Every NEXT_PUBLIC_* value is intentionally shipped to the browser. Never put a private key, seed phrase, API secret, exchange credential, or server-only token in one of these variables or in the repository.

  4. Build and start:

    pnpm build
    npm start

    For local development, pnpm dev runs the app with hot reload.

Because every value is a build-time public variable and there is no database, hosting is just serving a static Next.js frontend. Point NEXT_PUBLIC_RPC_URL at your own RPC to avoid the shared public endpoint's rate limits.

Browser and deployment hardening

The production configuration sends a Content Security Policy plus anti-framing, MIME-sniffing, referrer, permissions, HSTS, and opener-isolation headers. Third-party JavaScript is not permitted by the CSP. Production browser source maps are disabled.

For the official deployment, protect the GitHub, Vercel, email, and domain-registrar accounts with passkeys or strong 2FA. Protect the production branch, limit who can deploy, keep Dependabot and CodeQL enabled, and review every dependency update before merging it. A compromised deployment account can serve altered JavaScript even when the public source repository itself is clean.

The native ETH multisender always uses Multicall3. ERC-20 batches use the generated ToolPackDisperse helper only after an exact runtime-bytecode check. The helper artifact is compiled from contracts/ToolPackDisperse.sol during development and production builds, so no precompiled legacy helper bytecode is shipped.

Verifying a deployment matches the source

To confirm a hosted instance is running the code you expect:

  • Read the source. The repository is public and MIT licensed. The tools' behavior is exactly what the code shows; there is no hidden backend that could diverge from it.
  • Build it yourself. Clone, install, and build from a specific commit, then compare against the deployment's behavior. Since the app is client-side, what runs in your browser is the built frontend and nothing more.
  • Watch the network. Open your browser's developer tools and inspect the network tab while using a tool. Tool-specific requests go to the chain RPC, Blockscout, openchain.xyz for unknown selectors, and api.github.com for an optional star count. Reown/WalletConnect may also make wallet-discovery or relay requests when wallet integration is configured. Offline computations themselves do not transmit their inputs.
  • Inspect each transaction in your wallet. Your wallet shows the exact call and value before you sign. That is the final, authoritative check on what any tool is actually asking you to do.

Reporting issues

If you find a security problem, report it through the repository's issue or security-contact channels rather than disclosing it publicly, so it can be addressed before it is widely known.