UNPKG

@abstraxn/relayer

Version:

Abstraxn Relayer package for handling gas-less transactions, facilitating smart contract interactions, and relaying user transactions efficiently.

216 lines (165 loc) 6.09 kB
# Abstraxn Relayer SDK ## Overview The Abstraxn Relayer package is designed for handling gas-less transactions, facilitating smart contract interactions, and efficiently relaying user transactions on the Ethereum blockchain. Now with **real-time WebSocket notifications** for instant transaction status updates! ## Installation Using `npm` package manager: ```bash npm install @abstraxn/relayer ``` Or using `yarn` package manager: ```bash yarn add @abstraxn/relayer ``` ## Usage ```typescript import { Relayer } from "@abstraxn/relayer"; import { ChainId } from "@abstraxn/core-types"; const relayerConfig = { relayerUrl: "https://your-relayer-url.com", chainId: ChainId.MAINNET, signer: yourSignerInstance, provider: yourProviderInstance, webSocket: { enabled: true, // Enable WebSocket real-time updates autoConnect: true, // Auto-connect on initialization reconnection: true, // Auto-reconnect on disconnection }, }; const relayer = new Relayer(relayerConfig); // Example: Building a relayer transaction const buildTxParams = { contractAddress: "0xYourContractAddress", abi: yourContractAbi, method: "yourMethodName", args: ["arg1", "arg2"], }; // Build and send transaction with real-time updates relayer.buildRelayerTx(buildTxParams).then(async (txData) => { console.log("Build Relayer Transaction Response: ", txData); // Send with real-time WebSocket notifications const response = await relayer.sendRelayerTxWithRealTimeUpdates({ ...txData, enableRealTimeUpdates: true, webSocketEvents: { onTransactionUpdate: (update) => { console.log(`Transaction ${update.txId} status: ${update.status}`); if (update.status === 'confirmed') { console.log('🎉 Transaction confirmed!', update.blockNumber); } }, onError: (error) => { console.error('WebSocket error:', error); }, }, }); console.log("Transaction ID:", response.transactionId); }); ``` ## API ### Core Methods - **buildRelayerTx(params: BuildRelayerTxParams)** - Builds a transaction to be sent to the relayer. - **buildRelayerTxEIP712(params: BuildRelayerTxParams)** - Builds a transaction using EIP-712 signing standard. - **sendRelayerTx(params: SendRelayerTxParams)** - Sends a transaction to the relayer for processing. - **sendSafeRelayerTx(params: SendSafeRelayerTxParams)** - Sends a safe wallet transaction to the relayer for processing. - **getRelayerTxStatus(transactionId: string)** - Retrieves the status of a relayer transaction. ### 🚀 WebSocket Methods (New!) - **sendRelayerTxWithRealTimeUpdates(params: SendRelayerTxWithWebSocketParams)** - Sends a transaction and automatically subscribes to real-time status updates. - **sendSafeRelayerTxWithRealTimeUpdates(params: SendSafeRelayerTxWithWebSocketParams)** - Sends a safe wallet transaction and automatically subscribes to real-time status updates. - **subscribeToTransaction(transactionId: string, events?: RelayerWebSocketEvents)** - Subscribe to real-time updates for a specific transaction. - **unsubscribeFromTransaction(transactionId: string)** - Unsubscribe from transaction updates. - **connectWebSocket()** / **disconnectWebSocket()** - Manual WebSocket connection control. - **isWebSocketConnected(): boolean** - Check WebSocket connection status. ## 🔄 Real-time Features ### WebSocket Events ```typescript interface RelayerWebSocketEvents { onTransactionUpdate?: (update: TransactionStatusUpdate) => void; onTransactionCreated?: (event: TransactionCreatedEvent) => void; onConnect?: () => void; onDisconnect?: () => void; onError?: (error: Error) => void; } ``` ### Transaction Status Flow 1. **initiated** → Transaction created and submitted to relayer 2. **pending** → Transaction submitted to blockchain 3. **confirmed** → Transaction successfully mined ✅ 4. **failed** → Transaction failed ❌ 5. **rejected** → Transaction rejected by network ❌ ## Examples ### Basic Real-time Tracking ```typescript // Subscribe to existing transaction await relayer.subscribeToTransaction(txId, { onTransactionUpdate: (update) => { console.log(`Status: ${update.status}`); if (update.status === 'confirmed') { console.log(`Confirmed in block ${update.blockNumber}`); } }, }); ``` ### Promise-based Tracking ```typescript const txData = await relayer.buildRelayerTx(params); const response = await relayer.sendRelayerTx(txData); const finalStatus = await new Promise((resolve, reject) => { relayer.subscribeToTransaction(response.transactionId, { onTransactionUpdate: (update) => { if (update.status === 'confirmed') resolve(update); if (update.status === 'failed') reject(new Error('Failed')); }, }); }); ``` ### Multiple Transactions ```typescript const transactions = ['tx1', 'tx2', 'tx3']; transactions.forEach(txId => { relayer.subscribeToTransaction(txId, { onTransactionUpdate: (update) => { console.log(`[${txId}] Status: ${update.status}`); }, }); }); ``` ## Migration Guide ### Before (Polling) ```typescript const response = await relayer.sendRelayerTx(txData); // Manual polling required setInterval(async () => { const status = await relayer.getRelayerTxStatus(response.transactionId); console.log(status); }, 2000); ``` ### After (Real-time) ```typescript const response = await relayer.sendRelayerTxWithRealTimeUpdates({ ...txData, enableRealTimeUpdates: true, webSocketEvents: { onTransactionUpdate: (update) => console.log(update.status), }, }); // Instant updates! 🚀 ``` ## Benefits - ✅ **Instant Updates**: No more 2-5 second polling delays - ✅ **Better Performance**: Reduced server load and bandwidth - ✅ **Improved UX**: Real-time feedback for users - ✅ **Battery Efficient**: No constant background requests - ✅ **Backward Compatible**: Existing code still works - ✅ **Auto Fallback**: Falls back to polling if WebSocket fails For detailed examples, see [WEBSOCKET_EXAMPLES.md](./WEBSOCKET_EXAMPLES.md).