Skip to main content

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

FeatureDescription
standard:connectConnect to wallet
standard:disconnectDisconnect from wallet
standard:eventsSubscribe to wallet events
solana:signMessageSign arbitrary messages
solana:signTransactionSign transactions
solana:signAndSendTransactionSign and broadcast transactions

Framework Integration

For framework-specific wallet adapter integration, see:

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