Skip to main content
The SDK provides adapters to normalize different wallet implementations into a unified interface. EVM adapters return an EvmWallet — pass it to PredexonSdkConfig.wallet. Solana adapters return a SolanaSigner — pass it to PredexonSdkConfig.solanaSigner.
The SDK is designed for server-side use. Using the SDK in browser code exposes your API key to end users. If you need browser wallet signing, proxy SDK calls through your backend.

Import server adapters from the /server subpath:
import {
  createTurnkeyAdapter,
  createPrivyServerAdapter,
  createRawKeyAdapter,
} from '@predexon/trade-sdk/server';

createTurnkeyAdapter

Creates an EVM wallet backed by Turnkey’s secure key infrastructure.
import { PredexonSDK } from '@predexon/trade-sdk';
import { createTurnkeyAdapter } from '@predexon/trade-sdk/server';

const wallet = createTurnkeyAdapter({
  apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY!,
  apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY!,
  organizationId: process.env.TURNKEY_ORGANIZATION_ID!,
  signWith: process.env.TURNKEY_SIGN_WITH!, // wallet address or wallet ID
  rpcUrl: process.env.POLYGON_RPC_URL, // optional, enables sendTransaction
});

const sdk = new PredexonSDK({ apiKey: process.env.PREDEXON_API_KEY!, wallet });
Peer dependencies:
npm install @turnkey/api-key-stamper @turnkey/http @turnkey/viem

createPrivyServerAdapter

Creates an EVM wallet for Privy embedded wallets using server-side credentials.
import { PredexonSDK } from '@predexon/trade-sdk';
import { createPrivyServerAdapter } from '@predexon/trade-sdk/server';

const wallet = createPrivyServerAdapter({
  appId: process.env.PRIVY_APP_ID!,
  appSecret: process.env.PRIVY_APP_SECRET!,
  authorizationPrivateKey: process.env.PRIVY_AUTHORIZATION_PRIVATE_KEY!,
  walletAddress: userEmbeddedWalletAddress, // the user's Privy embedded wallet
});

const sdk = new PredexonSDK({ apiKey: process.env.PREDEXON_API_KEY!, wallet });
Peer dependency:
npm install @privy-io/node

createRawKeyAdapter

Creates an EVM wallet from a raw private key. For development and testing only.
import { PredexonSDK } from '@predexon/trade-sdk';
import { createRawKeyAdapter } from '@predexon/trade-sdk/server';

const wallet = createRawKeyAdapter({
  privateKey: process.env.PRIVATE_KEY!,
  rpcUrl: process.env.POLYGON_RPC_URL, // optional, enables sendTransaction
});

const sdk = new PredexonSDK({ apiKey: process.env.PREDEXON_API_KEY!, wallet });

EVM Adapters

Import EVM adapters from the main entry:
import { createViemAdapter, createEip1193Adapter } from '@predexon/trade-sdk';

createViemAdapter

Adapts any viem WalletClient to the SDK interface. This adapter is synchronous.
import { PredexonSDK, createViemAdapter } from '@predexon/trade-sdk';
import { createWalletClient, http } from 'viem';
import { polygon } from 'viem/chains';
import { privateKeyToAccount } from 'viem/accounts';

// Server-side with local account
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
  account,
  chain: polygon,
  transport: http(process.env.POLYGON_RPC_URL),
});

const wallet = createViemAdapter(walletClient);
const sdk = new PredexonSDK({ apiKey: process.env.PREDEXON_API_KEY!, wallet });

createEip1193Adapter

Adapts any EIP-1193 provider (MetaMask, WalletConnect, etc.) to the SDK interface. This adapter is async.
import { createEip1193Adapter } from '@predexon/trade-sdk';

// Your app handles wallet connection
const accounts = await provider.request({ method: 'eth_requestAccounts' });
const address = accounts[0];

const wallet = await createEip1193Adapter({ provider, address });

Solana Adapters

Import Solana adapters from the main entry:
import { createSolanaAdapter, createPrivySolanaAdapter } from '@predexon/trade-sdk';

createSolanaAdapter

Creates a Solana signer from signing functions. Use this for custom Solana wallet integrations.
import { PredexonSDK, createSolanaAdapter } from '@predexon/trade-sdk';
import { Keypair, VersionedTransaction } from '@solana/web3.js';
import nacl from 'tweetnacl';

const keypair = Keypair.fromSecretKey(/* your secret key bytes */);

const solanaSigner = createSolanaAdapter({
  signSolanaTransaction: async (base64Tx) => {
    const tx = VersionedTransaction.deserialize(Buffer.from(base64Tx, 'base64'));
    tx.sign([keypair]);
    return Buffer.from(tx.serialize()).toString('base64');
  },
  signSolanaMessage: async (message) => {
    const messageBytes = new TextEncoder().encode(message);
    const signature = nacl.sign.detached(messageBytes, keypair.secretKey);
    return Buffer.from(signature).toString('base64');
  },
});

const sdk = new PredexonSDK({ apiKey: process.env.PREDEXON_API_KEY!, solanaSigner });

Required Methods by Operation

OperationRequired Method
enableTrading (Kalshi)signSolanaMessage (only if wallet not already registered)
placeOrder (Kalshi)signSolanaTransaction
redeem (Kalshi)signSolanaTransaction

createPrivySolanaAdapter

Adapts Privy embedded Solana wallets using the Wallet Standard.
import { PredexonSDK, createPrivySolanaAdapter } from '@predexon/trade-sdk';
import { useSolanaStandardWallets } from '@privy-io/react-auth/solana';

const { wallets } = useSolanaStandardWallets();
const privyWallet = wallets.find(w => w.name === 'Privy');
const address = privyWallet.accounts[0].address;

const solanaSigner = createPrivySolanaAdapter(privyWallet, address);
const sdk = new PredexonSDK({ apiKey: process.env.PREDEXON_API_KEY!, solanaSigner });

Multi-Venue Configuration

To trade on both Polymarket (EVM) and Kalshi (Solana), provide both wallet and solanaSigner:
import { PredexonSDK } from '@predexon/trade-sdk';
import { createTurnkeyAdapter } from '@predexon/trade-sdk/server';
import { createSolanaAdapter } from '@predexon/trade-sdk';

const wallet = createTurnkeyAdapter({ /* ... */ });
const solanaSigner = createSolanaAdapter({ /* ... */ });

const sdk = new PredexonSDK({
  apiKey: process.env.PREDEXON_API_KEY!,
  wallet,
  solanaSigner,
});

Approval Mode Detection

For Polymarket enableTrading, the SDK automatically detects your wallet’s capabilities:
Wallet CapabilityAuto-Selected ModeBehavior
signTransaction available'sign'Wallet signs, server broadcasts
sendTransaction only'broadcast'Wallet signs and broadcasts
NeitherErrorSigningError thrown
You can override auto-detection by explicitly passing approvals:
await sdk.enableTrading({
  core: { venue: 'polymarket', wallet: address },
  approvals: 'broadcast', // or 'sign', or 'skip'
});

Type Reference

EvmWallet

Returned by all EVM adapters. Pass to PredexonSdkConfig.wallet.
interface EvmWallet {
  account: EvmSigner;
  capabilities?: AdapterCapabilities;
  extensions?: AdapterExtensions;
  metadata?: AdapterMetadata;
}

EvmSigner

The signing interface for EVM wallets.
interface EvmSigner {
  getAddress(): Promise<string>;
  signTypedData(typedData: Eip712TypedData): Promise<string>;
  signTransaction?(tx: EvmTransactionRequest): Promise<string>;
  sendTransaction?(tx: EvmTransactionRequest): Promise<string>;
}

SolanaSigner

The signing interface for Solana wallets.
interface SolanaSigner {
  signSolanaTransaction(transactionBase64: string): Promise<string>;
  signSolanaMessage?(message: string): Promise<string>;
}

Next Steps