Solana Integration
Complete guide for integrating Oko with Solana.
Wallet Standard Support
Oko Solana SDK fully supports the Wallet Standard, making it compatible with most Solana dApps automatically.
Installation
npm install @oko-wallet/oko-sdk-svm @solana/web3.js
Basic Setup
import { OkoSvmWallet } from "@oko-wallet/oko-sdk-svm";
// Initialize Solana wallet
const initRes = OkoSvmWallet.init({
api_key: "your-api-key",
chain_id: "solana:mainnet",
theme: "dark",
});
if (!initRes.success) {
throw new Error(`Solana wallet initialization failed: ${initRes.err}`);
}
const wallet = initRes.data;
// Connect to get public key
await wallet.connect();
console.log("Connected:", wallet.publicKey?.toBase58());
On-chain Signing
Send Transaction
import {
Connection,
Transaction,
SystemProgram,
PublicKey,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
const connection = new Connection("https://api.mainnet-beta.solana.com");
const recipientAddress = new PublicKey("...");
// Create transaction
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: wallet.publicKey!,
toPubkey: recipientAddress,
lamports: 0.1 * LAMPORTS_PER_SOL,
}),
);
// Get recent blockhash
const { blockhash } = await connection.getLatestBlockhash();
transaction.recentBlockhash = blockhash;
transaction.feePayer = wallet.publicKey!;
// Sign and send
const signature = await wallet.sendTransaction(transaction, connection);
console.log("Transaction sent:", signature);
Sign and Send Transaction (Phantom-compatible)
// Alternative method that returns { signature }
const { signature } = await wallet.signAndSendTransaction(
transaction,
connection,
);
Sign Multiple Transactions
const transactions = [transaction1, transaction2, transaction3];
const signedTransactions = await wallet.signAllTransactions(transactions);
// Send each signed transaction
for (const signed of signedTransactions) {
const sig = await connection.sendRawTransaction(signed.serialize());
console.log("Sent:", sig);
}
Off-chain Signing
Sign Message
const message = new TextEncoder().encode("Welcome to Oko!");
const signature = await wallet.signMessage(message);
console.log("Signature:", Buffer.from(signature).toString("base64"));
Event Handling
// Listen for connection events
wallet.on("connect", (publicKey) => {
console.log("Connected:", publicKey.toBase58());
});
wallet.on("disconnect", () => {
console.log("Disconnected");
});
// Listen for account changes
wallet.on("accountChanged", (publicKey) => {
if (publicKey) {
console.log("Account changed:", publicKey.toBase58());
} else {
console.log("Account disconnected");
}
});
// Remove listener
const unsubscribe = wallet.on("connect", handler);
unsubscribe(); // or wallet.off("connect", handler);
Wallet Standard Integration
import {
OkoSvmWallet,
registerWalletStandard,
type WalletStandardConfig,
} from "@oko-wallet/oko-sdk-svm";
import { SOLANA_CHAINS } from "@solana/wallet-standard-chains";
import {
SolanaSignIn,
SolanaSignMessage,
SolanaSignTransaction,
SolanaSignAndSendTransaction,
} from "@solana/wallet-standard-features";
const SOLANA_CONFIG: WalletStandardConfig = {
chains: SOLANA_CHAINS,
features: {
signIn: SolanaSignIn,
signMessage: SolanaSignMessage,
signTransaction: SolanaSignTransaction,
signAndSendTransaction: SolanaSignAndSendTransaction,
},
rpcEndpoints: {
"solana:mainnet": "https://api.mainnet-beta.solana.com",
"solana:devnet": "https://api.devnet.solana.com",
},
};
const initRes = OkoSvmWallet.init({
api_key: "your-api-key",
chain_id: "solana:mainnet",
theme: "dark",
});
if (initRes.success) {
// Register wallet-standard separately (call once globally)
registerWalletStandard(initRes.data, [SOLANA_CONFIG]);
}
Supported Features
| Feature | Description |
|---|---|
standard:connect | Connect to wallet |
standard:disconnect | Disconnect from wallet |
standard:events | Subscribe to wallet events |
solana:signMessage | Sign arbitrary messages |
solana:signTransaction | Sign transactions |
solana:signAndSendTransaction | Sign and broadcast transactions |
Framework Integration
For framework-specific wallet adapter integration, see:
- Solana Wallet Adapter Integration —
Use with
@solana/wallet-adapter-reactfor Solana dApps
Versioned Transactions
Oko supports both legacy and versioned transactions:
import { VersionedTransaction, TransactionMessage } from "@solana/web3.js";
// Create versioned transaction
const messageV0 = new TransactionMessage({
payerKey: wallet.publicKey!,
recentBlockhash: blockhash,
instructions: [transferInstruction],
}).compileToV0Message();
const versionedTx = new VersionedTransaction(messageV0);
// Sign versioned transaction
const signedTx = await wallet.signTransaction(versionedTx);
Disconnect
await wallet.disconnect();
console.log("Wallet disconnected");
Next Steps
- Solana Wallet Adapter Integration -
Use Oko with
@solana/wallet-adapter-react - Ethereum Integration - Add Ethereum support
- Cosmos Integration - Add Cosmos support
- React Integration - React patterns
- Error Handling - Error handling