@pokvault/sdk
v0.1.1
Published
TypeScript SDK for POK Vault - Estimate merge and split costs for prediction market outcome tokens
Maintainers
Readme
POK Vault SDK
TypeScript SDK for estimating cross platform merge and split costs for prediction market outcome tokens on POK Vault.
Features
- Market Access: Get market details supported by POK Vault
- Estimation: Calculate merge (early exit) and split costs
Installation
npm install @pokvault/sdk
# or
yarn add @pokvault/sdk
# or
pnpm add @pokvault/sdkQuick Start
The typical workflow is: Initialize → Get market by key → Estimate
import { POKVaultSDK, parseUnits } from '@pokvault/sdk';
// 1. Initialize the SDK
const sdk = new POKVaultSDK({
bscRpcUrl: 'https://your-rpc-url.com', // Recommended: Provide your own RPC for better performance
});
// Note: If no RPC URL is provided, the default BSC RPC will be used, but performance may be slow
await sdk.initialize();
// 2. Get market using market key
const market = sdk.getMarket('opinion-3019_polymarket-537486');
// 3. Use the first available pair for estimation
if (market && market.pairs.length > 0) {
const pair = market.pairs[0];
// Estimate merge (early exit)
const mergeEstimate = await sdk.estimateMerge(
pair.outcomeTokenA,
BigInt(pair.outcomeIdA),
pair.outcomeTokenB,
BigInt(pair.outcomeIdB),
parseUnits('10', 18) // Amount in USDT decimals (18)
);
console.log('USDT to receive:', mergeEstimate.estimatedUsdtReceived);
console.log('Vault has liquidity:', mergeEstimate.vaultHasLiquidity);
}Understanding Market Keys
Market keys uniquely identify arbitrage opportunities between Polymarket and Opinion markets.
Format
opinion-{marketId}_polymarket-{marketId}Market ID in the key refers to a specific child market, NOT the parent topic.
Example: Opinion
- Topic ID 196: "How much revenue will the U.S. raise from tariffs in 2025?" (Parent topic)
- Market ID 3018: "How much revenue will the U.S. raise from tariffs in 2025? - <$100b" (Child market)
- Market ID 3019: "How much revenue will the U.S. raise from tariffs in 2025? - $200-500b" (Child market)
- Market ID 3020: "How much revenue will the U.S. raise from tariffs in 2025? - >$500b" (Child market)
The same is true for polymarket markets as well
Real Market Key Example
// Market key for: "Will the U.S. collect between $200b and $500b in revenue in 2025?"
const marketKey = 'opinion-3019_polymarket-537486';
// opinion-3019: Opinion child market for "$200-500b" outcome
// polymarket-537486: Corresponding Polymarket market
const market = sdk.getMarket(marketKey);Usage Examples
Estimating Merge (Early Exit)
Merge allows you to exchange opposite outcome tokens (e.g., NO from Polymarket + YES from Opinion) for USDT at a discounted rate.
import { POKVaultSDK, parseUnits } from '@pokvault/sdk';
const sdk = new POKVaultSDK();
await sdk.initialize();
// Get market using market key
const market = sdk.getMarket('opinion-3019_polymarket-537486');
if (market && market.pairs.length > 0) {
const pair = market.pairs[0];
// Estimate merge for 10 tokens worth
const mergeEstimate = await sdk.estimateMerge(
pair.outcomeTokenA,
BigInt(pair.outcomeIdA),
pair.outcomeTokenB,
BigInt(pair.outcomeIdB),
parseUnits('10', 18) // Amount in USDT decimals (18)
);
console.log('USDT to receive:', mergeEstimate.estimatedUsdtReceived);
console.log('Vault has liquidity:', mergeEstimate.vaultHasLiquidity);
console.log('Available liquidity:', mergeEstimate.availableVaultLiquidity);
}Estimating Split
Split allows you to exchange USDT for opposite outcome tokens.
import { POKVaultSDK, parseUnits } from '@pokvault/sdk';
const sdk = new POKVaultSDK();
await sdk.initialize();
// Get market using market key
const market = sdk.getMarket('opinion-3019_polymarket-537486');
if (market && market.pairs.length > 0) {
const pair = market.pairs[0];
// Estimate split for 10 USDT
const splitEstimate = await sdk.estimateSplit(
pair.outcomeTokenA,
BigInt(pair.outcomeIdA),
pair.outcomeTokenB,
BigInt(pair.outcomeIdB),
parseUnits('10', 18) // 10 USDT (18 decimals)
);
console.log('Tokens to receive:', splitEstimate.estimatedTokensReceived);
console.log('Vault has tokens:', splitEstimate.vaultHasTokens);
}Advanced: Finding Markets (Optional)
While most users work with market keys directly, you can also discover markets:
// Search by URL pattern (less common)
const markets = sdk.findMarketsByUrl('polymarket.com/market/will-the-us-collect-between-200b-and-500b-in-revenue-in-2025');
// Search by provider, status, or question (less common)
const filteredMarkets = sdk.searchMarkets({
provider: 'opinion',
status: 'allowed',
question: 'revenue',
});
// Get all markets (less common)
const allMarkets = sdk.getAllMarkets();Advanced: Finding Token Pairs by Addresses (Optional)
// If you already have the token addresses and IDs, you can find the pair directly
const result = sdk.findPair(
'0x77b0052a346b22ea1f3112e3fcef079567ed9979', // Polymarket token address (bridged on BSC)
BigInt('50221315964000194764695024582522009520159992363520263771661265416131198909217'), // Polymarket NO token ID
'0xAD1a38cEc043e70E83a3eC30443dB285ED10D774', // Opinion token address
BigInt('35513231639220004155539972249688601367978586874260018267891931866327496090530') // Opinion YES token ID
);
if (result) {
console.log('Market key:', result.market.marketKey);
// Output: "opinion-3019_polymarket-537486"
}Checking Vault Liquidity
const liquidity = await sdk.getVaultLiquidity();
console.log('Total assets:', liquidity.totalAssets);
console.log('Available for early exits:', liquidity.availableLiquidity);API Reference
POKVaultSDK
Constructor
new POKVaultSDK(config?: SDKConfig)Config Options:
bscRpcUrl?: string- BSC RPC URL (optional, default:https://bsc-dataseed.binance.org/)- ⚠️ Recommended: Provide your own RPC URL for better performance
- If not provided, a warning will be shown on each estimation call
Core Methods
initialize(): Promise<void>
Initialize the SDK by fetching all supported markets. Must be called before using other methods.
getMarket(marketKey: string): MarketMetadata | undefined
Get a specific market by its market key. This is the primary method for accessing markets.
Example:
const market = sdk.getMarket('opinion-3019_polymarket-537486');estimateMerge(tokenA: Address, tokenIdA: bigint, tokenB: Address, tokenIdB: bigint, amount: bigint): Promise<MergeEstimationResult>
Estimate merge (early exit) - returns USDT received. Note: amount must be in USDT decimals (18).
estimateSplit(tokenA: Address, tokenIdA: bigint, tokenB: Address, tokenIdB: bigint, usdtAmount: bigint): Promise<SplitEstimationResult>
Estimate split - returns outcome tokens received. Note: usdtAmount must be in USDT decimals (18).
getVaultLiquidity(): Promise<{ totalAssets: bigint; availableLiquidity: bigint }>
Get current vault liquidity information.
Discovery Methods (Optional)
getAllMarkets(): MarketMetadata[]
Get all supported markets.
searchMarkets(params: MarketSearchParams): MarketMetadata[]
Search markets by various criteria.
Params:
url?: string- URL pattern to matchprovider?: string- Provider ID ('polymarket', 'opinion')status?: 'allowed' | 'paused' | 'removed'- Market statusquestion?: string- Question text to search
findMarketsByUrl(urlPattern: string): MarketMetadata[]
Find markets containing the given URL pattern.
findPair(tokenA: Address, tokenIdA: bigint, tokenB: Address, tokenIdB: bigint)
Find a specific token pair by token addresses and IDs.
Types
MarketMetadata
interface MarketMetadata {
marketKey: string;
question: string;
providerQuestions: Map<string, string>;
providerImages: Map<string, string>;
providerTokenIds: Map<string, { yesTokenId: string; noTokenId: string }>;
providerUrls: Map<string, string>;
pairs: OutcomeTokenPair[];
overallStatus: 'allowed' | 'paused' | 'removed';
}OutcomeTokenPair
interface OutcomeTokenPair {
key: string;
outcomeTokenA: Address;
outcomeIdA: string;
outcomeIdAIsYesTokenId: boolean;
outcomeTokenB: Address;
outcomeIdB: string;
outcomeIdBIsYesTokenId: boolean;
earlyExitAmountContract: Address;
decimalsA: number;
decimalsB: number;
status: 'allowed' | 'paused' | 'removed';
timestamp: number;
}MergeEstimationResult
interface MergeEstimationResult {
estimatedUsdtReceived: bigint;
vaultHasLiquidity: boolean;
availableVaultLiquidity: bigint;
totalAssets: bigint;
totalEarlyExited: bigint;
}SplitEstimationResult
interface SplitEstimationResult {
estimatedTokensReceived: bigint;
vaultHasTokens: boolean;
vaultBalanceTokenA: bigint;
vaultBalanceTokenB: bigint;
}Constants
import {
VAULT_ADDRESS,
POLYGON_ERC1155_BRIDGED_BSC_ADDRESS,
OPINION_ERC1155_ADDRESS,
USDT_ADDRESS,
POLYMARKET_DECIMALS, // 6
OPINION_DECIMALS, // 18
USDT_DECIMALS, // 18
BSC_CHAIN_ID, // 56
} from '@pokvault/sdk';Token Decimals
When working with token amounts, remember:
- Polymarket tokens: 6 decimals
- Opinion tokens: 18 decimals
- USDT: 18 decimals
Use viem's parseUnits and formatUnits for conversions:
import { parseUnits, formatUnits } from 'viem';
// Parse 100 USDT to wei (18 decimals)
const usdtAmount = parseUnits('100', 18);
// Format wei back to human-readable
const formatted = formatUnits(usdtAmount, 18); // "100"Error Handling
try {
const sdk = new POKVaultSDK();
await sdk.initialize();
const estimate = await sdk.estimateMerge(/* ... */);
console.log('Estimate:', estimate);
} catch (error) {
console.error('SDK Error:', error);
}License
MIT
