import { Client } from '@miradorlabs/web-sdk';
// Initialize client (typically done once at app startup)
const client = new Client('your-api-key');
async function executeTokenSwap(params: {
inputToken: string;
outputToken: string;
inputAmount: string;
userAddress: string;
slippage: number;
}) {
// Create trace with initial context
const trace = client.trace({ name: 'TokenSwap' })
.addAttributes({
inputToken: params.inputToken,
outputToken: params.outputToken,
inputAmount: params.inputAmount,
userAddress: params.userAddress,
slippage: `${params.slippage}%`
})
.addTags(['swap', 'dex', 'ethereum'])
.addEvent('swap_initiated');
try {
// Step 1: Get quote
trace.addEvent('fetching_quote');
const quote = await fetchQuote(params);
trace.addEvent('quote_received', {
outputAmount: quote.outputAmount,
priceImpact: quote.priceImpact,
route: quote.route.join(' → ')
});
// Step 2: Check allowance and approve if needed
const allowance = await checkAllowance(params.inputToken, params.userAddress);
if (allowance < BigInt(params.inputAmount)) {
trace.addEvent('approval_required');
const approveTx = await wallet.sendTransaction(
buildApprovalTx(params.inputToken)
);
trace.addEvent('approval_submitted', { txHash: approveTx.hash })
.addTxHint(approveTx.hash, 'ethereum', 'Token approval');
await approveTx.wait();
trace.addEvent('approval_confirmed');
}
// Step 3: Execute swap
trace.addEvent('building_swap_transaction');
const swapTx = buildSwapTransaction(quote);
trace.addEvent('awaiting_signature');
const signedTx = await wallet.sendTransaction(swapTx);
trace.addEvent('swap_submitted', {
txHash: signedTx.hash,
gasLimit: swapTx.gasLimit.toString()
})
.addTxHint(signedTx.hash, 'ethereum', 'Swap execution');
// Step 4: Wait for confirmation
trace.addEvent('awaiting_confirmation');
const receipt = await signedTx.wait();
trace.addEvent('swap_confirmed', {
blockNumber: receipt.blockNumber,
gasUsed: receipt.gasUsed.toString(),
effectiveGasPrice: receipt.effectiveGasPrice.toString()
});
// Step 5: Verify output
const outputBalance = await getTokenBalance(
params.outputToken,
params.userAddress
);
trace.addEvent('swap_completed', {
outputReceived: outputBalance.toString(),
success: true
});
// Close the trace when done
await trace.close('Swap completed successfully');
return { success: true, txHash: signedTx.hash };
} catch (error) {
// Record failure
trace.addEvent('swap_failed', {
error: error.message,
code: error.code
});
// Close the trace on error
await trace.close('Swap failed');
return { success: false, error: error.message };
}
}