Skip to main content
Use Bun when you want fast local installs and a Node-compatible runtime for a 4Mica service. The server-side 4Mica integration uses Express middleware, which Bun can run through its Node compatibility layer.
This integration is not stable yet. For now, use the NodeJS quick start for the supported implementation.

Prerequisites

  • Bun installed locally.
  • A seller wallet address for payTo.
  • A buyer wallet with deposited collateral for testing.

Install

npm install express @4mica/x402 @x402/fetch @x402/axios viem

Create wallet

For wallet setup, see Wallet.
PRIVATE_KEY=0xYourPrivateKey
PAY_TO=0xYourSellerAddress
Use the private key only for buyer-side signing. Use PAY_TO as the seller address advertised by protected routes.

Deposit collateral

Deposit collateral for the buyer wallet before calling protected routes. Match the route network, such as eip155:84532 for Base Sepolia. To learn more about collateral setup, see Deposits and Withdrawals.

Protect a route

import express from "express";
import { paymentMiddlewareFromConfig } from "@4mica/x402/server/express";

const app = express();
app.use(express.json());

app.use(
  paymentMiddlewareFromConfig(
    {
      "GET /premium-content": {
        accepts: {
          scheme: "4mica-credit",
          price: "$0.10",
          network: "eip155:84532",
          payTo: process.env.PAY_TO ?? "0xYourAddress",
        },
        description: "Access to premium Bun content",
      },
    },
  ),
);

app.get("/premium-content", (req, res) => {
  res.json({ message: "Paid content from Bun" });
});

app.listen(3030, () => {
  console.log("Bun service running on http://localhost:3030");
});
Run it with Bun:
bun run server.ts

Support payment

import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { FourMicaEvmScheme } from "@4mica/x402/client";
import { privateKeyToAccount } from "viem/accounts";

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const scheme = await FourMicaEvmScheme.create(account);

const fetchWithPayment = wrapFetchWithPaymentFromConfig(fetch, {
  schemes: [{ network: "eip155:84532", client: scheme }],
});

const response = await fetchWithPayment("http://localhost:3030/premium-content");
const data = await response.json();