
Research
/Security News
Shai Hulud Strikes Again (v2)
Another wave of Shai-Hulud campaign has hit npm with more than 500 packages and 700+ versions affected.
@b3dotfun/anyspend-x402-solana-wallet-adapter
Advanced tools
Solana wallet-adapter bridge for x402 payment protocol - Connects @solana/wallet-adapter (v1) with x402 library (v2)
Solana wallet-adapter bridge for x402 payment protocol. Connects @solana/wallet-adapter (v1 format) with x402 library (v2 format).
The x402 library uses @solana/kit v2 (TransactionSigner interface), while browser wallet adapters use @solana/web3.js v1 (VersionedTransaction format). This package bridges the gap, allowing you to use popular Solana wallets (Phantom, Solflare, Ledger, etc.) with x402 payments.
npm install @b3dotfun/anyspend-x402-solana-wallet-adapter
# or
pnpm add @b3dotfun/anyspend-x402-solana-wallet-adapter
# or
yarn add @b3dotfun/anyspend-x402-solana-wallet-adapter
Peer Dependencies (usually already installed in browser apps):
npm install @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/web3.js react
@solana/wallet-adapter compatible walletThis package exports properly-typed React components that fix TypeScript compatibility issues with newer React versions:
import {
ConnectionProvider,
WalletProvider,
WalletModalProvider,
} from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
import { PhantomWalletAdapter } from "@solana/wallet-adapter-wallets";
import { useMemo } from "react";
function App() {
const endpoint = useMemo(() => "https://api.mainnet-beta.solana.com", []);
const wallets = useMemo(() => [new PhantomWalletAdapter()], []);
return (
<ConnectionProvider endpoint={endpoint}>
<WalletProvider wallets={wallets} autoConnect={false}>
<WalletModalProvider>
{/* Your app components */}
</WalletModalProvider>
</WalletProvider>
</ConnectionProvider>
);
}
import {
createWalletAdapterSigner,
useWallet,
WalletMultiButton,
} from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
import { wrapFetchWithPayment } from "@b3dotfun/anyspend-x402-fetch";
function MyComponent() {
const { publicKey, signAllTransactions, connected } = useWallet();
const fetchData = async () => {
if (!connected || !publicKey || !signAllTransactions) return;
// Create a signer adapter for the connected wallet
const signer = createWalletAdapterSigner(
publicKey.toBase58(),
signAllTransactions
);
// Wrap fetch with payment capability
const fetchWithPayment = wrapFetchWithPayment(fetch, signer);
// Make payment request
const response = await fetchWithPayment("https://api.example.com/premium-data");
const data = await response.json();
return data;
};
return (
<div>
<WalletMultiButton />
<button onClick={fetchData} disabled={!connected}>
Get Premium Data
</button>
</div>
);
}
import { createWalletAdapterSigner } from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
import { wrapFetchWithPayment } from "@b3dotfun/anyspend-x402-fetch";
const signer = createWalletAdapterSigner(publicKey.toBase58(), signAllTransactions, count =>
console.log(`Signing ${count} transaction(s)...`),
);
const fetchWithPayment = wrapFetchWithPayment(
fetch,
signer,
undefined, // maxValue - let server determine
undefined, // payment selector
{ svmConfig: { rpcUrl: "https://api.mainnet-beta.solana.com" } },
);
import {
createWalletAdapterSigner,
useWallet,
WalletMultiButton,
} from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
import { wrapFetchWithPayment } from "@b3dotfun/anyspend-x402-fetch";
import { useState } from "react";
export function PremiumContent() {
const { publicKey, signAllTransactions, connected } = useWallet();
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const fetchPremiumData = async () => {
if (!connected || !publicKey || !signAllTransactions) {
alert('Please connect your wallet');
return;
}
setLoading(true);
try {
// Create signer adapter
const signer = createWalletAdapterSigner(
publicKey.toBase58(),
signAllTransactions,
(count) => console.log(`Please sign ${count} transaction(s)`)
);
// Wrap fetch with payment
const fetchWithPayment = wrapFetchWithPayment(
fetch,
signer,
undefined,
undefined,
{ svmConfig: { rpcUrl: 'https://api.mainnet-beta.solana.com' } }
);
// Make payment request
const response = await fetchWithPayment('https://api.example.com/premium');
const result = await response.json();
setData(result);
} catch (error) {
console.error('Payment failed:', error);
alert(error.message);
} finally {
setLoading(false);
}
};
return (
<div>
<WalletMultiButton />
<button
onClick={fetchPremiumData}
disabled={!connected || loading}
>
{loading ? 'Processing...' : 'Get Premium Data (Pay with USDC)'}
</button>
{data && <pre>{JSON.stringify(data, null, 2)}</pre>}
</div>
);
}
createWalletAdapterSigner(walletAddress, signAllTransactions, onSign?)Creates a TransactionSigner compatible with x402 from a wallet adapter.
Parameters:
walletAddress (string): The wallet's public key as base58 string (e.g., publicKey.toBase58())signAllTransactions (function): The wallet adapter's signAllTransactions functiononSign (optional function): Callback invoked when signing starts, receives transaction countReturns:
TransactionSigner: Signer instance for use with wrapFetchWithPaymentExample:
const signer = createWalletAdapterSigner(publicKey.toBase58(), signAllTransactions, count =>
setStatus(`Signing ${count} transaction(s)...`),
);
This package re-exports properly-typed React components from @solana/wallet-adapter-react and @solana/wallet-adapter-react-ui with fixed TypeScript compatibility:
ConnectionProviderProvides Solana RPC connection context to child components.
import { ConnectionProvider } from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
<ConnectionProvider endpoint="https://api.mainnet-beta.solana.com">
{children}
</ConnectionProvider>;
WalletProviderProvides wallet connection and management to child components.
import { WalletProvider } from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
<WalletProvider wallets={wallets} autoConnect={false}>
{children}
</WalletProvider>;
WalletModalProviderProvides modal UI for wallet selection.
import { WalletModalProvider } from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
<WalletModalProvider>{children}</WalletModalProvider>;
WalletMultiButtonPre-built wallet connect/disconnect button component.
import { WalletMultiButton } from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
<WalletMultiButton className="my-wallet-button" />;
useWallet()React hook to access wallet connection state and functions.
import { useWallet } from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
const { publicKey, connected, signAllTransactions } = useWallet();
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser Wallet (Phantom, Solflare, etc.) β
β Format: @solana/web3.js v1 VersionedTransaction β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β signAllTransactions()
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β createWalletAdapterSigner (THIS PACKAGE) β
β Converts: v2 Transaction β v1 VersionedTransaction β
β Signed v1 β v2 signature format β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TransactionSigner interface
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β x402 Library (@b3dotfun/anyspend-x402) β
β Format: @solana/kit v2 Transaction β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
messageBytes and signatures objectVersionedTransactionsignAllTransactions()This adapter works with any wallet that implements the @solana/wallet-adapter standard:
Full TypeScript support with exported types:
import {
createWalletAdapterSigner,
type TransactionSigner,
} from "@b3dotfun/anyspend-x402-solana-wallet-adapter";
@b3dotfun/anyspend-x402 - Core x402 library@b3dotfun/anyspend-x402-fetch - Fetch integration@b3dotfun/anyspend-x402-axios - Axios integration@solana/wallet-adapter-react - React wallet adapterSee the fullstack example for a complete implementation.
Apache-2.0
Contributions welcome! Please open an issue or PR on GitHub.
FAQs
Solana wallet-adapter bridge for x402 payment protocol - Connects @solana/wallet-adapter (v1) with x402 library (v2)
We found that @b3dotfun/anyspend-x402-solana-wallet-adapter demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 10 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Another wave of Shai-Hulud campaign has hit npm with more than 500 packages and 700+ versions affected.

Product
Add real-time Socket webhook events to your workflows to automatically receive software supply chain alert changes in real time.

Security News
ENISA has become a CVE Program Root, giving the EU a central authority for coordinating vulnerability reporting, disclosure, and cross-border response.