Wallet Connection
Connect wallets to the PrivChain SDK for signing transactions.
Connection Methods
Keypair (Backend/Agents)
For server-side agents and automated systems:
typescript
import { PrivChain } from '@privchain/sdk';
import { Keypair, Connection } from '@solana/web3.js';
import bs58 from 'bs58';
const privchain = new PrivChain({
connection: new Connection('https://api.mainnet-beta.solana.com'),
network: 'mainnet-beta'
});
// From base58 private key
const secretKey = bs58.decode(process.env.WALLET_PRIVATE_KEY!);
const wallet = Keypair.fromSecretKey(secretKey);
// From Uint8Array
const wallet2 = Keypair.fromSecretKey(new Uint8Array([...]));
// Generate new wallet
const newWallet = Keypair.generate();
console.log('New address:', newWallet.publicKey.toBase58());
console.log('Private key:', bs58.encode(newWallet.secretKey));
// Connect to PrivChain
await privchain.connect(wallet);
console.log('Connected:', privchain.publicKey);File-Based Key
Load from Solana CLI wallet file:
typescript
import { Keypair } from '@solana/web3.js';
import fs from 'fs';
// Solana CLI default location
const keyfile = `${process.env.HOME}/.config/solana/id.json`;
const secretKey = Uint8Array.from(JSON.parse(fs.readFileSync(keyfile, 'utf-8')));
const wallet = Keypair.fromSecretKey(secretKey);
await privchain.connect(wallet);Browser Wallets
For frontend applications with Phantom, Solflare, etc.:
typescript
import { PrivChain } from '@privchain/sdk';
import { Connection } from '@solana/web3.js';
const privchain = new PrivChain({
connection: new Connection('https://api.mainnet-beta.solana.com'),
network: 'mainnet-beta'
});
// Connect to browser wallet
async function connectPhantom() {
const { solana } = window as any;
if (!solana?.isPhantom) {
throw new Error('Phantom wallet not found');
}
const response = await solana.connect();
// Create wallet adapter
await privchain.connectBrowserWallet({
publicKey: response.publicKey,
signTransaction: solana.signTransaction.bind(solana),
signAllTransactions: solana.signAllTransactions.bind(solana)
});
console.log('Connected:', response.publicKey.toBase58());
}Wallet Adapter (React)
Using Solana Wallet Adapter:
typescript
import { useWallet } from '@solana/wallet-adapter-react';
import { usePrivChain } from '@privchain/react';
function WalletConnect() {
const { publicKey, signTransaction, signAllTransactions, connected } = useWallet();
const privchain = usePrivChain();
useEffect(() => {
if (connected && publicKey && signTransaction) {
privchain.connectBrowserWallet({
publicKey,
signTransaction,
signAllTransactions
});
}
}, [connected, publicKey]);
return (
<WalletMultiButton />
);
}Wallet Operations
Check Connection
typescript
// Check if connected
if (privchain.isConnected) {
console.log('Connected as:', privchain.publicKey?.toBase58());
}
// Get connection status
const status = privchain.getConnectionStatus();
// { connected: true, publicKey: '...', network: 'mainnet-beta' }Get Balances
typescript
// Get PRIV balance
const privBalance = await privchain.getBalance();
console.log(`PRIV: ${privBalance}`);
// Get SOL balance (for fees)
const solBalance = await privchain.getSolBalance();
console.log(`SOL: ${solBalance}`);
// Get all balances
const balances = await privchain.getAllBalances();
console.log(balances);
// { priv: 1000, sol: 0.5 }Switch Wallet
typescript
// Disconnect current wallet
await privchain.disconnect();
// Connect new wallet
const newWallet = Keypair.generate();
await privchain.connect(newWallet);Security Best Practices
Environment Variables
Never hardcode private keys
Always use environment variables or secure key management.
typescript
// ✅ Good
const key = process.env.WALLET_PRIVATE_KEY;
// ❌ Bad
const key = '5K3j8f...'; // Never do this!Key Rotation
Rotate keys regularly for agents:
typescript
import { Keypair } from '@solana/web3.js';
import fs from 'fs';
// Generate new key
const newKey = Keypair.generate();
// Save securely (example - use proper secret management)
fs.writeFileSync(
'/secure/location/new-key.json',
JSON.stringify(Array.from(newKey.secretKey))
);
// Transfer funds from old to new
const oldKey = loadOldKey();
await privchain.connect(oldKey);
await privchain.transfer({
to: newKey.publicKey.toBase58(),
amount: await privchain.getBalance() - 1 // Leave 1 PRIV for fees
});
// Switch to new key
await privchain.connect(newKey);Hardware Security Modules (HSM)
For production agents:
typescript
import { HsmWallet } from '@privchain/hsm';
// Connect to HSM-backed wallet
const hsmWallet = new HsmWallet({
keyId: 'privchain-agent-key',
region: 'us-east-1' // AWS KMS example
});
await privchain.connect(hsmWallet);Multi-Wallet Management
Multiple Agents
typescript
class AgentPool {
private agents: Map<string, PrivChain> = new Map();
async addAgent(name: string, privateKey: string) {
const privchain = new PrivChain({
connection: this.connection,
network: 'mainnet-beta'
});
const wallet = Keypair.fromSecretKey(bs58.decode(privateKey));
await privchain.connect(wallet);
this.agents.set(name, privchain);
}
getAgent(name: string): PrivChain {
return this.agents.get(name)!;
}
async getTotalBalance(): Promise<number> {
let total = 0;
for (const agent of this.agents.values()) {
total += await agent.getBalance();
}
return total;
}
}Delegation
Create sub-wallets with limited permissions:
typescript
// Main wallet creates delegation
const mainWallet = await privchain.connect(mainKey);
const delegation = await privchain.identity.delegate({
to: subAgentPublicKey,
permissions: ['transfer'],
maxAmount: 100, // Max 100 PRIV per transaction
expiry: Date.now() + 86400000 // 24 hours
});
// Sub-agent uses delegation
const subAgent = new PrivChain({ /* config */ });
await subAgent.connectWithDelegation({
wallet: subAgentKey,
delegation: delegation
});
// Sub-agent can now transfer up to 100 PRIV
await subAgent.transfer({ to: '...', amount: 50 });Error Handling
typescript
import { WalletError, ConnectionError } from '@privchain/sdk';
try {
await privchain.connect(wallet);
} catch (error) {
if (error instanceof ConnectionError) {
console.error('Failed to connect to Solana:', error.message);
} else if (error instanceof WalletError) {
console.error('Wallet error:', error.message);
} else {
throw error;
}
}Next Steps
- Token Operations - Transfer and manage PRIV
- Privacy Operations - Use privacy pools
- API Reference - Full API docs