Wallet Adapter (Legacy)
Low-level provider API for dApps that need direct access to the Morsel window object.
The legacy adapter exposes Morsel's provider directly on the browser window object, similar to how Phantom and other Solana wallets have historically worked. This gives you full, low-level control over the connection lifecycle, signing, and event handling.
For new dApps, use Morsel Wallet Connect — it handles all wallets automatically via the Wallet Standard with a single package.
When to use this
- Your dApp targets a specific Morsel/Cookie integration without needing multi-wallet support
- You are working in a legacy codebase already using window.solana patterns
- You need raw provider access for custom signing flows
- You are building a browser extension or native app that injects its own provider
No npm package required. Morsel injects the provider automatically into the window object when the user has Morsel Wallet installed. Just detect it and use it.
Provider Detection
Morsel injects its provider under three namespaces for maximum compatibility:
javascript detect.js
function getMorselProvider() {
if ("morsel" in window) return window.morsel;
if ("cookie" in window) return window.cookie;
if ("solana" in window && window.solana.isMorsel) return window.solana;
return null;
}
const provider = getMorselProvider();
if (!provider) {
window.open("https://morselwallet.app/install", "_blank");
}Always wait for the DOM to be ready before checking for the provider. Some browsers inject it asynchronously.
javascript
window.addEventListener("load", () => {
const provider = getMorselProvider();
// safe to use
});Connect & Disconnect
Request wallet connection. This triggers the Morsel approval popup for the user.
javascript connect.js
const provider = window.morsel;
try {
const { publicKey } = await provider.connect();
console.log("Connected:", publicKey.toBase58());
} catch (err) {
console.error(err);
}
await provider.disconnect();Connect silently (only succeeds if already approved):
javascript
await provider.connect({ onlyIfTrusted: true });Public Key
javascript
const pubkey = provider.publicKey;
console.log(pubkey.toBase58());
console.log(pubkey.toBytes());Sign Message
javascript sign-message.js
const message = "Sign in to MyDapp";
const encodedMessage = new TextEncoder().encode(message);
const { signature } = await provider.signMessage(encodedMessage, "utf8");
const sigBase58 = bs58.encode(signature);Sign Transaction
javascript sign-tx.js
import { Transaction, SystemProgram, PublicKey } from "@solana/web3.js";
const tx = new Transaction().add(
SystemProgram.transfer({
fromPubkey: provider.publicKey,
toPubkey: new PublicKey("RECIPIENT_ADDRESS"),
lamports: 1_000_000,
})
);
const signedTx = await provider.signTransaction(tx);
const { signature } = await provider.signAndSendTransaction(tx);For multiple transactions:
javascript
const signedTxs = await provider.signAllTransactions([tx1, tx2, tx3]);Events
javascript events.js
provider.on("accountChanged", (publicKey) => {
if (publicKey) {
console.log("Switched to:", publicKey.toBase58());
} else {
console.log("Disconnected");
}
});
provider.on("connect", (publicKey) => console.log("Connected:", publicKey.toBase58()));
provider.on("disconnect", () => console.log("Disconnected"));
provider.off("accountChanged", handler);Namespace Reference
| Namespace | Flag | Use case |
|---|---|---|
| window.morsel | .isMorsel === true | Primary Morsel namespace — always prefer this |
| window.cookie | .isCookie === true | Cookie Chain ecosystem alias |
| window.solana | .isMorsel === true | Solana compat — only set if no other Solana wallet is installed |