Basic Slippage Implementation
Stablecoin Swap (Low Slippage)
Use minimal slippage for stable asset pairs:Copy
Ask AI
const stablecoinSwap = await getQuote({
from: {
account: {
sessionAddress: "0x1cBFbFd62a276BF6D79d504eA4CA75a7baDcf5b1",
adminAddress: "0xc162a3cE45ad151eeCd0a5532D6E489D034aB3B8",
accountAddress: "0xE20295ec513DEf805D9c3083b0C8EaB64692D764"
},
asset: { assetId: "ds:usdc" },
amount: "1000000" // 1 USDC
},
to: {
asset: { assetId: "ds:usdt" }
},
slippageTolerance: 10 // 0.1% for stablecoins
});
Major Token Swap (Medium Slippage)
Standard slippage for major cryptocurrency pairs:Copy
Ask AI
const ethToUsdcSwap = await getQuote({
from: {
account: {
sessionAddress: "0x1cBFbFd62a276BF6D79d504eA4CA75a7baDcf5b1",
adminAddress: "0xc162a3cE45ad151eeCd0a5532D6E489D034aB3B8",
accountAddress: "0xE20295ec513DEf805D9c3083b0C8EaB64692D764"
},
asset: { assetId: "ds:eth" },
amount: "100000000000000" // 1 ETH
},
to: {
asset: { assetId: "ds:usdc" }
},
slippageTolerance: 100 // 1% for major tokens
});
Volatile Token Swap (High Slippage)
Higher slippage tolerance for volatile or newer tokens:Copy
Ask AI
const volatileTokenSwap = await getQuote({
from: {
account: {
sessionAddress: "0x1cBFbFd62a276BF6D79d504eA4CA75a7baDcf5b1",
adminAddress: "0xc162a3cE45ad151eeCd0a5532D6E489D034aB3B8",
accountAddress: "0xE20295ec513DEf805D9c3083b0C8EaB64692D764"
},
asset: { assetId: "eip155:1/erc20:0x1234567890123456789012345678901234567890" },
amount: "100000000000000" // 1000 tokens
},
to: {
asset: { assetId: "ds:eth" }
},
slippageTolerance: 300 // 3% for volatile tokens
});
Contract Call Examples
DeFi Protocol Interaction
Smart contract calls with slippage tolerance for DEX operations:Copy
Ask AI
const uniswapSwapWithSlippage = await prepareCallQuote({
account: {
sessionAddress: "0x1cBFbFd62a276BF6D79d504eA4CA75a7baDcf5b1",
adminAddress: "0xc162a3cE45ad151eeCd0a5532D6E489D034aB3B8",
accountAddress: "0xE20295ec513DEf805D9c3083b0C8EaB64692D764"
},
targetChain: "eip155:8453", // Base
calls: [{
to: "0x2626664c2603336E57B271c5C0b26F421741e481", // Uniswap V3 Router
data: "0x414bf389000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda029130000000000000000000000004200000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000e20295ec513def805d9c3083b0c8eab64692d764000000000000000000000000000000000000000000000000000000006748d28800000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000",
value: "0x0"
}],
allowanceRequirements: [{
assetType: "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
amount: "1000000",
spender: "0x2626664c2603336E57B271c5C0b26F421741e481"
}],
tokensRequired: [{
assetType: "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
amount: "1000000"
}],
slippageTolerance: 100 // 1% slippage for DEX operations
});
Advanced Implementation Patterns
Adaptive Slippage Based on Market Conditions
Market-Adaptive Slippage
Copy
Ask AI
interface MarketConditions {
volatility: 'low' | 'medium' | 'high';
liquidityDepth: 'shallow' | 'medium' | 'deep';
networkCongestion: 'low' | 'medium' | 'high';
}
function calculateAdaptiveSlippage(
baseSlippage: number,
conditions: MarketConditions
): number {
let multiplier = 1;
// Adjust for volatility
switch (conditions.volatility) {
case 'high':
multiplier *= 2;
break;
case 'medium':
multiplier *= 1.5;
break;
case 'low':
multiplier *= 1;
break;
}
// Adjust for liquidity
switch (conditions.liquidityDepth) {
case 'shallow':
multiplier *= 1.8;
break;
case 'medium':
multiplier *= 1.3;
break;
case 'deep':
multiplier *= 1;
break;
}
// Adjust for network congestion
switch (conditions.networkCongestion) {
case 'high':
multiplier *= 1.2;
break;
case 'medium':
multiplier *= 1.1;
break;
case 'low':
multiplier *= 1;
break;
}
// Cap at 10% (1000 basis points)
return Math.min(Math.round(baseSlippage * multiplier), 1000);
}
// Usage example
const marketConditions: MarketConditions = {
volatility: 'high',
liquidityDepth: 'medium',
networkCongestion: 'low'
};
const adaptiveSlippage = calculateAdaptiveSlippage(100, marketConditions);
const quote = await getQuote({
from: {
account: yourAccount,
asset: { assetId: "ds:eth" },
amount: "100000000000000"
},
to: { asset: { assetId: "ds:usdc" } },
slippageTolerance: adaptiveSlippage // Dynamically calculated
});
Retry Logic with Progressive Slippage
Progressive Retry
Copy
Ask AI
async function executeWithProgressiveSlippage(
baseRequest: QuoteRequest,
options?: {
maxRetries?: number;
baseSlippage?: number;
maxSlippage?: number;
}
) {
const {
maxRetries = 3,
baseSlippage = 50, // 0.5%
maxSlippage = 500 // 5%
} = options || {};
// Generate progressive slippage values
const slippageSteps = [];
for (let i = 0; i < maxRetries; i++) {
const step = baseSlippage * Math.pow(2, i); // 50, 100, 200, 400...
slippageSteps.push(Math.min(step, maxSlippage));
}
let lastError;
for (let attempt = 0; attempt < maxRetries; attempt++) {
const currentSlippage = slippageSteps[attempt];
try {
console.log(`Attempt ${attempt + 1}: Using ${currentSlippage / 100}% slippage`);
const quote = await getQuote({
...baseRequest,
slippageTolerance: currentSlippage
});
const result = await executeQuote(quote);
console.log(`Success on attempt ${attempt + 1}`);
return result;
} catch (error: any) {
lastError = error;
if (error.code === 'QUOTE_REFUNDED' && attempt < maxRetries - 1) {
console.log(`Attempt ${attempt + 1} failed, retrying with higher slippage...`);
// Wait before retry to avoid rate limiting
await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)));
continue;
}
// Final attempt failed or non-retryable error
break;
}
}
throw new Error(`All ${maxRetries} attempts failed. Last error: ${lastError?.message}`);
}
// Usage
try {
const result = await executeWithProgressiveSlippage({
from: {
account: yourAccount,
asset: { assetId: "ds:eth" },
amount: "100000000000000"
},
to: { asset: { assetId: "ds:usdc" } }
}, {
maxRetries: 4,
baseSlippage: 75, // Start at 0.75%
maxSlippage: 400 // Cap at 4%
});
console.log('Transaction successful:', result);
} catch (error) {
console.error('All retry attempts failed:', error);
}
User-Configurable Slippage Settings
User Settings
Copy
Ask AI
interface SlippagePreferences {
mode: 'conservative' | 'balanced' | 'aggressive' | 'custom';
customValue?: number;
autoRetry?: boolean;
maxRetries?: number;
}
class SlippageManager {
private presets = {
conservative: {
stablecoin: 5, // 0.05%
major: 50, // 0.5%
volatile: 150 // 1.5%
},
balanced: {
stablecoin: 10, // 0.1%
major: 100, // 1%
volatile: 300 // 3%
},
aggressive: {
stablecoin: 25, // 0.25%
major: 200, // 2%
volatile: 500 // 5%
}
};
getSlippageForAssets(
fromAsset: string,
toAsset: string,
preferences: SlippagePreferences
): number {
if (preferences.mode === 'custom' && preferences.customValue) {
return preferences.customValue;
}
const assetType = this.categorizeAssetPair(fromAsset, toAsset);
const preset = this.presets[preferences.mode as keyof typeof this.presets];
return preset?.[assetType] || this.presets.balanced[assetType];
}
private categorizeAssetPair(fromAsset: string, toAsset: string): 'stablecoin' | 'major' | 'volatile' {
const stablecoins = ['usdc', 'usdt', 'dai', 'busd'];
const majorTokens = ['eth', 'btc', 'bnb', 'matic', 'avax'];
const isStablecoin = (asset: string) =>
stablecoins.some(stable => asset.toLowerCase().includes(stable));
const isMajor = (asset: string) =>
majorTokens.some(major => asset.toLowerCase().includes(major)) || isStablecoin(asset);
if (isStablecoin(fromAsset) && isStablecoin(toAsset)) {
return 'stablecoin';
}
if (isMajor(fromAsset) && isMajor(toAsset)) {
return 'major';
}
return 'volatile';
}
async executeWithUserPreferences(
request: QuoteRequest,
preferences: SlippagePreferences
) {
const slippage = this.getSlippageForAssets(
request.from.asset.assetId,
request.to.asset.assetId,
preferences
);
const enhancedRequest = {
...request,
slippageTolerance: slippage
};
if (preferences.autoRetry) {
return await executeWithProgressiveSlippage(enhancedRequest, {
maxRetries: preferences.maxRetries || 3,
baseSlippage: slippage
});
}
const quote = await getQuote(enhancedRequest);
return await executeQuote(quote);
}
}
// Usage example
const slippageManager = new SlippageManager();
// Conservative user
const conservativeResult = await slippageManager.executeWithUserPreferences({
from: {
account: yourAccount,
asset: { assetId: "ds:eth" },
amount: "100000000000000"
},
to: { asset: { assetId: "ds:usdc" } }
}, {
mode: 'conservative',
autoRetry: true,
maxRetries: 2
});
// Custom slippage user
const customResult = await slippageManager.executeWithUserPreferences({
from: {
account: yourAccount,
asset: { assetId: "ds:usdc" },
amount: "1000000"
},
to: { asset: { assetId: "ds:eth" } }
}, {
mode: 'custom',
customValue: 75, // 0.75%
autoRetry: false
});
Multi-Chain Examples
Cross-Chain with Solana Assets
Solana + EVM
Copy
Ask AI
const crossChainQuote = await getQuote({
accounts: [
{
type: "kernel-v3.1-ecdsa",
signerAddress: "0x5d6fb4eb211a6a2e406a1111b54d26c534753c8e",
accountAddress: "0xb7bc0d7baf6761c302ff6772dfd8f9e22ec706e7"
},
{
type: "solana",
signerAddress: "5Cb2369421F8a00Ef556d662D6E97C1419B1d37c",
accountAddress: "5Cb2369421F8a00Ef556d662D6E97C1419B1d37c"
}
],
from: {
asset: { assetId: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/spl-token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }, // USDC on Solana
amount: "1000000"
},
to: {
asset: { assetId: "eip155:8453/erc20:0x4200000000000000000000000000000000000006" } // WETH on Base
},
slippageTolerance: 150 // 1.5% for cross-chain operations
});
Error Handling Examples
Complete Error Management
Error Handling
Copy
Ask AI
async function robustSlippageExecution(request: QuoteRequest) {
try {
const quote = await getQuote(request);
const result = await executeQuote(quote);
return { success: true, result };
} catch (error: any) {
console.error('Quote execution failed:', error);
// Handle specific slippage-related errors
switch (error.code) {
case 'QUOTE_REFUNDED':
return {
success: false,
error: 'SLIPPAGE_EXCEEDED',
message: 'Price moved beyond tolerance. Try again with higher slippage.',
suggestedSlippage: (request.slippageTolerance || 100) * 1.5,
retryable: true
};
case 'SLIPPAGE_TOO_HIGH':
return {
success: false,
error: 'SLIPPAGE_TOO_HIGH',
message: 'Slippage tolerance too high. Please use a lower value.',
maxRecommended: 500, // 5%
retryable: true
};
case 'INSUFFICIENT_BALANCE':
return {
success: false,
error: 'INSUFFICIENT_BALANCE',
message: 'Insufficient balance for this transaction.',
retryable: false
};
case 'RATE_LIMITED':
return {
success: false,
error: 'RATE_LIMITED',
message: 'Too many requests. Please wait before retrying.',
retryAfter: error.retryAfter || 5000,
retryable: true
};
default:
return {
success: false,
error: 'UNKNOWN_ERROR',
message: error.message || 'An unexpected error occurred.',
retryable: false
};
}
}
}
// Usage with error handling
const result = await robustSlippageExecution({
from: {
account: yourAccount,
asset: { assetId: "ds:eth" },
amount: "100000000000000"
},
to: { asset: { assetId: "ds:usdc" } },
slippageTolerance: 100
});
if (!result.success) {
console.log('Error:', result.message);
if (result.retryable) {
console.log('This error is retryable');
if (result.suggestedSlippage) {
console.log(`Suggested slippage: ${result.suggestedSlippage / 100}%`);
}
}
}
Recommended Values by Scenario
Production Defaults
- Stablecoins: 10-25 basis points (0.1-0.25%)
- Major tokens: 100 basis points (1%)
- Volatile tokens: 300 basis points (3%)
- Cross-chain: +50% of single-chain values
High-Volume Applications
- Start conservative: 50 basis points (0.5%)
- Auto-retry: Enable with 2-3 attempts
- Max slippage: 500 basis points (5%)
- Monitor success rates: Adjust based on data
Next Steps
Troubleshooting
Common issues and solutions for slippage tolerance implementation
Getting Started
Step-by-step implementation guide for slippage tolerance
Test your slippage implementation with small amounts first to ensure it works correctly before processing larger transactions.