@okx-dex/okx-dex-sdk
Version:
OKX DEX SDK
195 lines (194 loc) • 9.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// example.ts or test.ts
const index_1 = require("../../index");
const ethers_1 = require("ethers");
require("dotenv/config");
const evm_wallet_1 = require("../../core/evm-wallet");
// Use Base RPC URL or fallback to a public Base RPC
const baseRpcUrl = process.env.BASE_RPC_URL || process.env.EVM_RPC_URL || 'https://mainnet.base.org';
const provider = new ethers_1.ethers.JsonRpcProvider(baseRpcUrl);
const evmWallet = (0, evm_wallet_1.createEVMWallet)(process.env.EVM_PRIVATE_KEY, provider);
const client = new index_1.OKXDexClient({
apiKey: process.env.OKX_API_KEY,
secretKey: process.env.OKX_SECRET_KEY,
apiPassphrase: process.env.OKX_API_PASSPHRASE,
projectId: process.env.OKX_PROJECT_ID,
evm: {
wallet: evmWallet
}
});
const walletAddress = evmWallet.address;
async function main() {
var _a;
try {
console.log('=== Complete Swap Workflow with Broadcast and Tracking ===');
console.log('Wallet Address:', walletAddress);
// Verify we're connected to Base network
const network = await provider.getNetwork();
console.log('Connected to network:', network.name, 'Chain ID:', network.chainId);
// if (network.chainId !== 8453) {
// console.warn('⚠️ Warning: Not connected to Base mainnet (8453). Current:', network.chainId);
// }
// Step 1: Get swap data
console.log('\n1. Getting swap data...');
const swapData = await client.dex.getSwapData({
chainId: '8453', // Base mainnet
fromTokenAddress: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', // ETH
toTokenAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC on Base
amount: '3000000000000000', // 0.001 ETH in wei
slippage: '0.05',
userWalletAddress: walletAddress,
fromTokenReferrerWalletAddress: walletAddress,
feePercent: '0.0001'
});
const txData = (_a = swapData.data[0]) === null || _a === void 0 ? void 0 : _a.tx;
if (!txData) {
throw new Error('No transaction data received from swap API');
}
console.log('✅ Swap data received');
console.log('- From Token Amount:', swapData.data[0].routerResult.fromTokenAmount);
console.log('- To Token Amount:', swapData.data[0].routerResult.toTokenAmount);
console.log('- Price Impact:', swapData.data[0].routerResult.priceImpactPercentage);
console.log('- Gas Estimate:', txData.gas);
// Step 2: Sign the transaction
console.log('\n2. Signing transaction...');
// Get current nonce
const nonce = await provider.getTransactionCount(walletAddress);
console.log('Current nonce:', nonce);
const transaction = {
to: txData.to,
value: txData.value,
data: txData.data,
gasLimit: txData.gas,
gasPrice: txData.gasPrice,
maxPriorityFeePerGas: txData.maxPriorityFeePerGas || undefined,
nonce: nonce,
chainId: 8453 // Base mainnet chain ID
};
console.log('Transaction details:');
console.log('- To:', transaction.to);
console.log('- Value:', transaction.value);
console.log('- Gas Limit:', transaction.gasLimit);
console.log('- Gas Price:', transaction.gasPrice);
console.log('- Chain ID:', transaction.chainId);
const signedTx = await evmWallet.signTransaction(transaction);
console.log('✅ Transaction signed');
// Step 3: Broadcast the transaction with MEV protection
console.log('\n3. Broadcasting transaction with MEV protection...');
const broadcastResult = await client.dex.broadcastTransaction({
signedTx: signedTx,
chainIndex: '8453', // Base mainnet
address: walletAddress,
enableMevProtection: true // Enable MEV protection
});
console.log('✅ Transaction broadcasted');
console.log('- Order ID:', broadcastResult.data[0].orderId);
console.log('- Transaction Hash:', broadcastResult.data[0].txHash);
// Step 4: Track the transaction status
console.log('\n4. Tracking transaction status...');
const orderId = broadcastResult.data[0].orderId;
// Poll for transaction status
let attempts = 0;
const maxAttempts = 30; // 5 minutes with 10-second intervals
while (attempts < maxAttempts) {
try {
await new Promise(resolve => setTimeout(resolve, 3000)); // Wait 3 seconds
// First try to get the specific order
let orders = await client.dex.getTransactionOrders({
address: walletAddress,
chainIndex: '8453',
orderId: orderId
});
// If specific order not found, get all recent orders and find ours
if (!orders.data.length || !orders.data[0].orders.length) {
console.log(`📊 Status check ${attempts + 1}: Specific order not found, checking recent orders...`);
orders = await client.dex.getTransactionOrders({
address: walletAddress,
chainIndex: '8453',
limit: '20'
});
}
let foundOrder = null;
if (orders.data.length > 0 && orders.data[0].orders.length > 0) {
// Look for our specific order ID in the results
foundOrder = orders.data[0].orders.find(order => order.orderId === orderId);
if (!foundOrder) {
// If not found by orderId, take the most recent order (assuming it's ours)
foundOrder = orders.data[0].orders[0];
}
}
if (foundOrder) {
console.log(`📊 Status check ${attempts + 1}:`);
console.log('- Order ID:', foundOrder.orderId);
console.log('- Status:', getStatusText(foundOrder.txStatus));
console.log('- Transaction Hash:', foundOrder.txHash);
if (foundOrder.failReason && foundOrder.failReason.trim() !== '') {
console.log('- Failure Reason:', foundOrder.failReason);
}
// Check if transaction is complete (success or failed)
if (foundOrder.txStatus === '2') {
console.log('\n🎉 Transaction completed successfully!');
console.log('- Final Transaction Hash:', foundOrder.txHash);
console.log('- Explorer URL:', `https://web3.okx.com/explorer/base/tx/${foundOrder.txHash}`);
break;
}
else if (foundOrder.txStatus === '3') {
console.log('\n❌ Transaction failed');
console.log('- Failure Reason:', foundOrder.failReason);
break;
}
else {
// Also check the blockchain directly
try {
const receipt = await provider.getTransactionReceipt(foundOrder.txHash);
if (receipt) {
if (receipt.status === 1) {
console.log('\n🎉 Transaction confirmed on blockchain (success)!');
console.log('- Block Number:', receipt.blockNumber);
console.log('- Gas Used:', receipt.gasUsed.toString());
break;
}
else if (receipt.status === 0) {
console.log('\n❌ Transaction confirmed on blockchain (failed)');
break;
}
}
}
catch (receiptError) {
// Transaction not yet confirmed on blockchain
}
}
}
else {
console.log(`📊 Status check ${attempts + 1}: Order not found yet, transaction may still be processing...`);
}
attempts++;
}
catch (error) {
console.error('Error checking transaction status:', error);
attempts++;
}
}
if (attempts >= maxAttempts) {
console.log('\n⏰ Transaction status tracking timed out');
console.log('- You can check the status manually using the order ID:', orderId);
}
}
catch (error) {
console.error('Error in swap workflow:', error);
}
}
function getStatusText(status) {
switch (status) {
case '1': return 'Pending';
case '2': return 'Success';
case '3': return 'Failed';
case '0': return 'Submitted';
case 'pending': return 'Pending';
case 'success': return 'Success';
case 'failed': return 'Failed';
default: return `Unknown (${status})`;
}
}
main();