Integration Examples
Learn how to integrate the Aori SDK into your application with detailed examples for common use cases.
Basic Integration
The simplest way to integrate Aori is to use the SDK functions directly. Here's a complete example:
Complete Integration Example
import {
getQuote,
signOrder,
submitSwap,
pollOrderStatus
} from '@aori/aori-ts';
async function executeSwap() {
try {
// 1. Request a quote
const quote = await getQuote({
offerer: '0xYourAddress',
recipient: '0xYourAddress',
inputToken: '0x4200000000000000000000000000000000000006',
outputToken: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
inputAmount: '1000000000000000000',
inputChain: 'base',
outputChain: 'arbitrum'
});
console.log(`Quote received: ${quote.outputAmount} output tokens`);
// 2. Sign the order
const signature = await signOrder(quote, {
privateKey: process.env.PRIVATE_KEY
});
// 3. Submit the swap
const swap = await submitSwap({
orderHash: quote.orderHash,
signature: signature
});
console.log(`Swap submitted: ${swap.orderHash}`);
// 4. Poll for completion
const finalStatus = await pollOrderStatus(swap.orderHash, 'https://api.aori.io', {
onStatusChange: (status) => {
console.log(`Status update: ${status.type}`);
},
interval: 1000,
timeout: 60000
});
console.log('Swap completed:', finalStatus);
} catch (error) {
console.error('Swap failed:', error);
}
}
Frontend Integration
For frontend applications, use the EIP-712 signing method that works with wallet providers:
React + Wagmi Example
import { useAccount, useWalletClient } from 'wagmi';
import {
getQuote,
signReadableOrder,
submitSwap
} from '@aori/aori-ts';
function SwapComponent() {
const { address } = useAccount();
const { data: walletClient } = useWalletClient();
const handleSwap = async () => {
// 1. Get quote
const quote = await getQuote({
offerer: address,
recipient: address,
inputToken: '0x...',
outputToken: '0x...',
inputAmount: '1000000000000000000',
inputChain: 'base',
outputChain: 'arbitrum'
});
// 2. Create wallet wrapper for signing
const walletWrapper = {
signTypedData: async (params) => {
return walletClient.signTypedData({
account: params.account,
domain: params.domain,
types: params.types,
primaryType: params.primaryType,
message: params.message
});
}
};
// 3. Sign with EIP-712
const { orderHash, signature } = await signReadableOrder(
quote,
walletWrapper,
address
);
// 4. Submit swap
const swap = await submitSwap({
orderHash,
signature
});
console.log('Swap submitted:', swap.orderHash);
};
return (
<button onClick={handleSwap}>
Execute Cross-Chain Swap
</button>
);
}
Error Handling
Implement robust error handling for production applications:
Error Handling Example
import { getQuote, submitSwap } from '@aori/aori-ts';
async function safeSwap(quoteRequest) {
try {
const quote = await getQuote(quoteRequest);
// Validate quote parameters
if (BigInt(quote.outputAmount) === 0n) {
throw new Error('Invalid quote: zero output amount');
}
// Check slippage tolerance
const expectedOutput = calculateExpectedOutput(quoteRequest);
const actualOutput = BigInt(quote.outputAmount);
const slippage = ((expectedOutput - actualOutput) * 10000n) / expectedOutput;
if (slippage > 100n) { // 1% slippage
throw new Error('Slippage too high');
}
// Proceed with swap...
} catch (error) {
if (error.message.includes('Quote request failed')) {
// Handle quote errors
console.error('Unable to get quote:', error);
} else if (error.message.includes('Swap request failed')) {
// Handle swap submission errors
console.error('Failed to submit swap:', error);
} else {
// Handle other errors
console.error('Unexpected error:', error);
}
throw error;
}
}
Batch Operations
Process multiple swaps efficiently:
Batch Processing
import { getQuote, signOrder, submitSwap } from '@aori/aori-ts';
async function batchSwaps(swapRequests) {
const results = [];
// Get all quotes in parallel
const quotes = await Promise.all(
swapRequests.map(request => getQuote(request))
);
// Process each quote
for (const [index, quote] of quotes.entries()) {
try {
const signature = await signOrder(quote, {
privateKey: process.env.PRIVATE_KEY
});
const swap = await submitSwap({
orderHash: quote.orderHash,
signature
});
results.push({
success: true,
orderHash: swap.orderHash,
request: swapRequests[index]
});
} catch (error) {
results.push({
success: false,
error: error.message,
request: swapRequests[index]
});
}
}
return results;
}
WebSocket Integration
Subscribe to real-time order updates:
WebSocket Subscription
import { AoriWebSocket } from '@aori/aori-ts';
const ws = new AoriWebSocket('wss://api.aori.io', {
onMessage: (event) => {
console.log(`Order ${event.order.orderHash}: ${event.eventType}`);
// Handle different event types
switch (event.eventType) {
case 'created':
console.log('New order created');
break;
case 'received':
console.log('Order received on source chain');
break;
case 'completed':
console.log('Order completed on destination chain');
break;
case 'failed':
console.log('Order failed');
break;
}
},
onConnect: () => {
console.log('Connected to Aori WebSocket');
},
onDisconnect: (event) => {
console.log('Disconnected:', event.reason);
},
onError: (error) => {
console.error('WebSocket error:', error);
}
});
// Connect and handle lifecycle
await ws.connect();
// Disconnect when done
ws.disconnect();