FAQ

Is TxEngine really free?

Yes. Early-access tokens are free with 1 tx/sec. We’ll announce options if higher throughput becomes available.

How do I enable Jito routing?

Append jito=1 to the Sender URL and include your own Jito tip instruction in the transaction. TxEngine does not
add or redirect tips, and no tip goes to any LumLabs wallet.

Do you calculate priority fees or blockhash for me?

Not by default. Use your own or a public RPC — or email hello@lumlabs.io to request LumLabs RPC quota.

Is TxEngine really free?

Yes. Early-access tokens are free with 1 tx/sec. We’ll announce options if higher throughput becomes available.

How do I enable Jito routing?

Append jito=1 to the Sender URL and include your own Jito tip instruction in the transaction. TxEngine does not
add or redirect tips, and no tip goes to any LumLabs wallet.

Do you calculate priority fees or blockhash for me?

Not by default. Use your own or a public RPC — or email hello@lumlabs.io to request LumLabs RPC quota.

JavaScript (Node, @solana/web3.js)

const { Connection, Keypair, Transaction, SystemProgram, PublicKey, sendAndConfirmTransaction, ComputeBudgetProgram } = require('@solana/web3.js'); const bs58 = require('bs58'); const axios = require('axios'); // Load your wallet keypair from environment variable that you use to send the transactions from const SECRET_KEY = process.env.SECRET_KEY; if (!SECRET_KEY) { throw new Error('SECRET_KEY environment variable is required'); } const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY)); // Set up clients const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint // TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot // if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, // but it's required to tip Jito to make it work. // if you don't need Jito you can specify jito=0 or just leave it empty const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`; // Create a custom connection for the transaction engine const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed'); async function sendTransaction() { try { // Get latest blockhash using RPC client const { blockhash } = await rpcClient.getLatestBlockhash(); console.log(`Got blockhash: ${blockhash}`); // Create transfer instruction for sending 0.000001 SOL const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient const transaction = new Transaction(); transaction.recentBlockhash = blockhash; transaction.feePayer = sender.publicKey; // Add priority fee transaction.add( ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1000, }) ); // Add transfer instruction transaction.add( SystemProgram.transfer({ fromPubkey: sender.publicKey, toPubkey: receiverPubkey, lamports: 1000, // 0.000001 SOL }) ); // Sign the transaction transaction.sign(sender); // Send transaction via transaction engine console.log(`Sending transaction at ${new Date().toISOString()}`); console.log(`Using transaction engine: ${txEngineEndpoint}`); const signature = await txEngineConnection.sendRawTransaction(transaction.serialize()); console.log(`Transaction sent at ${new Date().toISOString()}`); console.log(`🎉 SUCCESS! Transaction signature: ${signature}`); return signature; } catch (error) { console.error(`Error: ${error.message}`); throw error; } } // Run the script sendTransaction() .then(signature => { console.log('Transaction completed successfully'); process.exit(0); }) .catch(error => { console.error('Transaction failed:', error); process.exit(1); });

Python (solana-py + solders)

import os from solders.keypair import Keypair from solana.rpc.api import Client from solders.system_program import TransferParams, transfer from solders.message import Message from solders.transaction import Transaction from solders.hash import Hash from solders.pubkey import Pubkey import requests from datetime import datetime # Load your wallet keypair from environment variable that you use to send the transactions from SECRET = os.environ["SECRET_KEY"] sender = Keypair.from_base58_string(SECRET) # Set up clients rpc_client = Client("https://api.mainnet-beta.solana.com") # For RPC calls, you can use any RPC endpoint # TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot # if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, # but it's required to tip Jito to make it work. # if you don't need Jito you can specify jito=0 or just leave it empty tx_engine_endpoint = f"https://{os.environ['TXENGINE_HOST']}?token={os.environ['TXENGINE_TOKEN']}&jito=1" tx_engine_client = Client(endpoint=tx_engine_endpoint, timeout=10) # For sending transactions try: # Get latest blockhash using RPC client blockhash_response = rpc_client.get_latest_blockhash() blockhash = blockhash_response.value.blockhash print(f"Got blockhash: {blockhash}") # Create transfer instruction for sending 0.000001 SOL receiver_pubkey = Pubkey.from_string("SOME_RECEIVER_PUBLIC_KEY") # Replace with actual recipient ixns = [transfer(TransferParams( from_pubkey=sender.pubkey(), to_pubkey=receiver_pubkey, lamports=1000 # 0.000001 SOL ))] # Create message and transaction msg = Message(ixns, sender.pubkey()) tx = Transaction([sender], msg, blockhash) # Send transaction via transaction engine print(f"Sending transaction at {datetime.now()}") print(f"Using transaction engine: {tx_engine_endpoint}") sig = tx_engine_client.send_transaction(tx) print(f"Transaction sent at {datetime.now()}") print(f"🎉 SUCCESS! Transaction signature: {sig.value}") except Exception as e: print(f"Error: {e}") raise

JavaScript (Node, @solana/web3.js)

const { Connection, Keypair, Transaction, SystemProgram, PublicKey, sendAndConfirmTransaction, ComputeBudgetProgram } = require('@solana/web3.js'); const bs58 = require('bs58'); const axios = require('axios'); // Load your wallet keypair from environment variable that you use to send the transactions from const SECRET_KEY = process.env.SECRET_KEY; if (!SECRET_KEY) { throw new Error('SECRET_KEY environment variable is required'); } const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY)); // Set up clients const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint // TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot // if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, // but it's required to tip Jito to make it work. // if you don't need Jito you can specify jito=0 or just leave it empty const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`; // Create a custom connection for the transaction engine const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed'); async function sendTransaction() { try { // Get latest blockhash using RPC client const { blockhash } = await rpcClient.getLatestBlockhash(); console.log(`Got blockhash: ${blockhash}`); // Create transfer instruction for sending 0.000001 SOL const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient const transaction = new Transaction(); transaction.recentBlockhash = blockhash; transaction.feePayer = sender.publicKey; // Add priority fee transaction.add( ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1000, }) ); // Add transfer instruction transaction.add( SystemProgram.transfer({ fromPubkey: sender.publicKey, toPubkey: receiverPubkey, lamports: 1000, // 0.000001 SOL }) ); // Sign the transaction transaction.sign(sender); // Send transaction via transaction engine console.log(`Sending transaction at ${new Date().toISOString()}`); console.log(`Using transaction engine: ${txEngineEndpoint}`); const signature = await txEngineConnection.sendRawTransaction(transaction.serialize()); console.log(`Transaction sent at ${new Date().toISOString()}`); console.log(`🎉 SUCCESS! Transaction signature: ${signature}`); return signature; } catch (error) { console.error(`Error: ${error.message}`); throw error; } } // Run the script sendTransaction() .then(signature => { console.log('Transaction completed successfully'); process.exit(0); }) .catch(error => { console.error('Transaction failed:', error); process.exit(1); });

Python (solana-py + solders)

import os from solders.keypair import Keypair from solana.rpc.api import Client from solders.system_program import TransferParams, transfer from solders.message import Message from solders.transaction import Transaction from solders.hash import Hash from solders.pubkey import Pubkey import requests from datetime import datetime # Load your wallet keypair from environment variable that you use to send the transactions from SECRET = os.environ["SECRET_KEY"] sender = Keypair.from_base58_string(SECRET) # Set up clients rpc_client = Client("https://api.mainnet-beta.solana.com") # For RPC calls, you can use any RPC endpoint # TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot # if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, # but it's required to tip Jito to make it work. # if you don't need Jito you can specify jito=0 or just leave it empty tx_engine_endpoint = f"https://{os.environ['TXENGINE_HOST']}?token={os.environ['TXENGINE_TOKEN']}&jito=1" tx_engine_client = Client(endpoint=tx_engine_endpoint, timeout=10) # For sending transactions try: # Get latest blockhash using RPC client blockhash_response = rpc_client.get_latest_blockhash() blockhash = blockhash_response.value.blockhash print(f"Got blockhash: {blockhash}") # Create transfer instruction for sending 0.000001 SOL receiver_pubkey = Pubkey.from_string("SOME_RECEIVER_PUBLIC_KEY") # Replace with actual recipient ixns = [transfer(TransferParams( from_pubkey=sender.pubkey(), to_pubkey=receiver_pubkey, lamports=1000 # 0.000001 SOL ))] # Create message and transaction msg = Message(ixns, sender.pubkey()) tx = Transaction([sender], msg, blockhash) # Send transaction via transaction engine print(f"Sending transaction at {datetime.now()}") print(f"Using transaction engine: {tx_engine_endpoint}") sig = tx_engine_client.send_transaction(tx) print(f"Transaction sent at {datetime.now()}") print(f"🎉 SUCCESS! Transaction signature: {sig.value}") except Exception as e: print(f"Error: {e}") raise

How It Works

Basic counters and status via the Telegram bot — coming soon. (Higher-throughput tiers may arrive later.)

Observe & iterate

04

TxEngine applies stake-weighted prioritization and submits through our protected path for predictable confirms.

Fast-lane execution

03

POST the base64 transaction to the Sender endpoint with your token. Add jito=1 to enable Jito routing; omit to use the default path or use just SWQoS.

Send to TxEngine

02

Use your own or public RPC to fetch a recent blockhash, set a priority fee, and (optionally) add a Jito tip instruction. Sign and serialize to base64. Or contact us for LumLabs RPC quota: hello@lumlabs.io.

Build & sign locally

01

Zero cost at 1 TPS — perfect for bots, infra keep-alives, and critical paths.

Deterministic performance — priority enforcement keeps throughput steady even at peak.

Global gateways — geo-distributed ingress for low latency.

Fair-use limits — sensible throttling to protect the lane.

Jito-ready — opt-in via jito=1; you supply tips directly in the transaction.

Key Benefits

Integration Notes

No default RPC: we don’t calculate priority fees or recent blockhash. Use your own or public RPC, or email: hello@lumlabs.io for LumLabs RPC quota.

Jito: append &jito=1 to the Sender URL. You must include your own Jito tip in the transaction; TxEngine doesn’t add or redirect tips, and no tips go to any LumLabs wallet.

Jito: append &jito=1 to the Sender URL.

You must include your own Jito tip in the transaction; TxEngine doesn’t add or redirect tips, and no tips go to any LumLabs wallet.

Body: { "transactions": ["BASE64_TX", "..."] }

(array of base64-serialized txs).

Auth & Endpoint: get both

in the Telegram bot.

Query auth param: token=

What TxEngine Does?

Build & sign locally, then POST the base64 tx to TxEngine.

Simple

sender flow

Optional

Jito routing

Add jito=1 to your request; include your own Jito tips in the transaction.

Priority

pathing (SWQoS)

Stake-weighted fast lane that bypasses public RPC queues.

Free tier

Stake-weighted fast lane that bypasses public RPC queues.

Use your own or a public RPC to fetch a recent blockhash and compute priority fees. If you want quota from LumLabs RPC, email: hello@lumlabs.io.

© 2025 LumLabs

Legal

Privacy Policy

Products & Tools

© 2025 LumLabs

Legal

Privacy Policy

Products & Tools

Legal

Privacy Policy

© 2025 LumLabs

Products & Tools

Legal

Privacy Policy

© 2025 LumLabs

Products & Tools

TxEngine — Free Priority Sending for Solana

Stake-weighted transaction delivery with optional

Jito routing. Point high-priority transactions to TxEngine and keep confirmations steady during congestion.

Priority sending with SWQoS + optional Jito routing.

No tips to LumLabs required.

Instant. Free. Up to 3 tx/sec.

TxEngine — Free Priority Sending for Solana

TxEngine — Free Priority Sending for Solana

Stake-weighted transaction delivery with optional

Jito routing. Point high-priority transactions to TxEngine and keep confirmations steady during congestion.

Priority sending with SWQoS + optional Jito routing. No tips to LumLabs required.

Instant. Free. Up to 3 tx/sec.

What TxEngine Does?

What TxEngine Does?

Simple

sender flow

Simple

sender flow

Build & sign locally, then POST the base64 tx to TxEngine.

Build & sign locally, then POST the base64 tx to TxEngine.

Stake-weighted fast lane that bypasses public RPC queues.

Stake-weighted fast lane that bypasses public RPC queues.

Priority

pathing (SWQoS)

Priority

pathing (SWQoS)

Free tier

Free tier

1 transaction per second per token during early access.

1 transaction per second per token during early access.

Optional

Jito routing

Optional

Jito routing

Add jito=1 to your request; include your own Jito tips

in the transaction.

Add jito=1 to your request; include your own Jito tips

in the transaction.

Use your own or a public RPC to fetch a recent blockhash and compute priority fees. If you want quota from LumLabs RPC, email: hello@lumlabs.io.

Use your own or a public RPC to fetch a recent blockhash and compute priority fees. If you want quota from LumLabs RPC, email: hello@lumlabs.io.

Key Benefits

Key Benefits

Zero cost at 1 TPS — perfect for bots, infra keep-alives, and critical paths.

Zero cost at 1 TPS — perfect for bots, infra keep-alives, and critical paths.

Deterministic performance — priority enforcement keeps throughput steady even at peak.

Deterministic performance — priority enforcement keeps throughput steady even at peak.

Global gateways — geo-distributed ingress for low latency.

Global gateways — geo-distributed ingress for low latency.

Fair-use limits — sensible throttling to protect the lane.

Fair-use limits — sensible throttling to protect the lane.

Jito-ready — opt-in via jito=1; you supply tips directly in the transaction.

Jito-ready — opt-in via jito=1; you supply tips directly in the transaction.

How It Works

How It Works

Basic counters and status via the Telegram bot — coming soon. (Higher-throughput tiers may arrive later.)

Basic counters and status via the Telegram bot — coming soon. (Higher-throughput tiers may arrive later.)

Observe & iterate

Observe & iterate

TxEngine applies stake-weighted prioritization and submits through our protected path for predictable confirms.

TxEngine applies stake-weighted prioritization and submits through our protected path for predictable confirms.

Fast-lane execution

Fast-lane execution

POST the base64 transaction to the Sender endpoint with your token. Add jito=1 to enable Jito routing; omit to use the default path or use just SWQoS.

POST the base64 transaction to the Sender endpoint with your token. Add jito=1 to enable Jito routing; omit to use the default path or use just SWQoS.

Send to TxEngine

Send to TxEngine

Use your own or public RPC to fetch a recent blockhash, set

a priority fee, and (optionally) add a Jito tip instruction. Sign and serialize to base64. Or contact us for LumLabs RPC quota: hello@lumlabs.io.

Use your own or public RPC to fetch a recent blockhash, set

a priority fee, and (optionally) add a Jito tip instruction. Sign and serialize to base64. Or contact us for LumLabs RPC quota: hello@lumlabs.io.

Build & sign locally

Build & sign locally

01

02

03

04

JavaScript (Node, @solana/web3.js)

const {
    Connection,
    Keypair,
    Transaction,
    SystemProgram,
    PublicKey,
    sendAndConfirmTransaction,
    ComputeBudgetProgram
} = require('@solana/web3.js');
const bs58 = require('bs58');
const axios = require('axios');

// Load your wallet keypair from environment variable that you use to send the transactions from
const SECRET_KEY = process.env.SECRET_KEY;
if (!SECRET_KEY) {
    throw new Error('SECRET_KEY environment variable is required');
}

const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY));

// Set up clients
const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint

// TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot 
// if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, 
// but it's required to tip Jito to make it work.
// if you don't need Jito you can specify jito=0 or just leave it empty
const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`;

// Create a custom connection for the transaction engine
const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed');

async function sendTransaction() {
    try {
        // Get latest blockhash using RPC client
        const { blockhash } = await rpcClient.getLatestBlockhash();
        console.log(`Got blockhash: ${blockhash}`);

        // Create transfer instruction for sending 0.000001 SOL
        const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient
        
        const transaction = new Transaction();
        transaction.recentBlockhash = blockhash;
        transaction.feePayer = sender.publicKey;

        // Add priority fee 
        transaction.add(
            ComputeBudgetProgram.setComputeUnitPrice({
                microLamports: 1000,
            })
        );

        // Add transfer instruction
        transaction.add(
            SystemProgram.transfer({
                fromPubkey: sender.publicKey,
                toPubkey: receiverPubkey,
                lamports: 1000, // 0.000001 SOL
            })
        );

        // Sign the transaction
        transaction.sign(sender);

        // Send transaction via transaction engine
        console.log(`Sending transaction at ${new Date().toISOString()}`);
        console.log(`Using transaction engine: ${txEngineEndpoint}`);

        const signature = await txEngineConnection.sendRawTransaction(transaction.serialize());
        console.log(`Transaction sent at ${new Date().toISOString()}`);
        console.log(`🎉 SUCCESS! Transaction signature: ${signature}`);

        return signature;
    } catch (error) {
        console.error(`Error: ${error.message}`);
        throw error;
    }
}

// Run the script
sendTransaction()
    .then(signature => {
        console.log('Transaction completed successfully');
        process.exit(0);
    })
    .catch(error => {
        console.error('Transaction failed:', error);
        process.exit(1);
    });

JavaScript (Node, @solana/web3.js)

const {
    Connection,
    Keypair,
    Transaction,
    SystemProgram,
    PublicKey,
    sendAndConfirmTransaction,
    ComputeBudgetProgram
} = require('@solana/web3.js');
const bs58 = require('bs58');
const axios = require('axios');

// Load your wallet keypair from environment variable that you use to send the transactions from
const SECRET_KEY = process.env.SECRET_KEY;
if (!SECRET_KEY) {
    throw new Error('SECRET_KEY environment variable is required');
}

const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY));

// Set up clients
const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint

// TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot 
// if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, 
// but it's required to tip Jito to make it work.
// if you don't need Jito you can specify jito=0 or just leave it empty
const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`;

// Create a custom connection for the transaction engine
const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed');

async function sendTransaction() {
    try {
        // Get latest blockhash using RPC client
        const { blockhash } = await rpcClient.getLatestBlockhash();
        console.log(`Got blockhash: ${blockhash}`);

        // Create transfer instruction for sending 0.000001 SOL
        const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient
        
        const transaction = new Transaction();
        transaction.recentBlockhash = blockhash;
        transaction.feePayer = sender.publicKey;

        // Add priority fee 
        transaction.add(
            ComputeBudgetProgram.setComputeUnitPrice({
                microLamports: 1000,
            })
        );

        // Add transfer instruction
        transaction.add(
            SystemProgram.transfer({
                fromPubkey: sender.publicKey,
                toPubkey: receiverPubkey,
                lamports: 1000, // 0.000001 SOL
            })
        );

        // Sign the transaction
        transaction.sign(sender);

        // Send transaction via transaction engine
        console.log(`Sending transaction at ${new Date().toISOString()}`);
        console.log(`Using transaction engine: ${txEngineEndpoint}`);

        const signature = await txEngineConnection.sendRawTransaction(transaction.serialize());
        console.log(`Transaction sent at ${new Date().toISOString()}`);
        console.log(`🎉 SUCCESS! Transaction signature: ${signature}`);

        return signature;
    } catch (error) {
        console.error(`Error: ${error.message}`);
        throw error;
    }
}

// Run the script
sendTransaction()
    .then(signature => {
        console.log('Transaction completed successfully');
        process.exit(0);
    })
    .catch(error => {
        console.error('Transaction failed:', error);
        process.exit(1);
    });
const {
    Connection,
    Keypair,
    Transaction,
    SystemProgram,
    PublicKey,
    sendAndConfirmTransaction,
    ComputeBudgetProgram
} = require('@solana/web3.js');
const bs58 = require('bs58');
const axios = require('axios');

// Load your wallet keypair from environment variable that you use to send the transactions from
const SECRET_KEY = process.env.SECRET_KEY;
if (!SECRET_KEY) {
    throw new Error('SECRET_KEY environment variable is required');
}

const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY));

// Set up clients
const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint

// TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot 
// if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, 
// but it's required to tip Jito to make it work.
// if you don't need Jito you can specify jito=0 or just leave it empty
const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`;

// Create a custom connection for the transaction engine
const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed');

async function sendTransaction() {
    try {
        // Get latest blockhash using RPC client
        const { blockhash } = await rpcClient.getLatestBlockhash();
        console.log(`Got blockhash: ${blockhash}`);

        // Create transfer instruction for sending 0.000001 SOL
        const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient
        
        const transaction = new Transaction();
        transaction.recentBlockhash = blockhash;
        transaction.feePayer = sender.publicKey;

        // Add priority fee 
        transaction.add(
            ComputeBudgetProgram.setComputeUnitPrice({
                microLamports: 1000,
            })
        );

        // Add transfer instruction
        transaction.add(
            SystemProgram.transfer({
                fromPubkey: sender.publicKey,
                toPubkey: receiverPubkey,
                lamports: 1000, // 0.000001 SOL
            })
        );

        // Sign the transaction
        transaction.sign(sender);

        // Send transaction via transaction engine
        console.log(`Sending transaction at ${new Date().toISOString()}`);
        console.log(`Using transaction engine: ${txEngineEndpoint}`);

        const signature = await txEngineConnection.sendRawTransaction(transaction.serialize());
        console.log(`Transaction sent at ${new Date().toISOString()}`);
        console.log(`🎉 SUCCESS! Transaction signature: ${signature}`);

        return signature;
    } catch (error) {
        console.error(`Error: ${error.message}`);
        throw error;
    }
}

// Run the script
sendTransaction()
    .then(signature => {
        console.log('Transaction completed successfully');
        process.exit(0);
    })
    .catch(error => {
        console.error('Transaction failed:', error);
        process.exit(1);
    });

Python (solana-py + solders)

const {
    Connection,
    Keypair,
    Transaction,
    SystemProgram,
    PublicKey,
    sendAndConfirmTransaction,
    ComputeBudgetProgram
} = require('@solana/web3.js');
const bs58 = require('bs58');
const axios = require('axios');

// Load your wallet keypair from environment variable that you use to send the transactions from
const SECRET_KEY = process.env.SECRET_KEY;
if (!SECRET_KEY) {
    throw new Error('SECRET_KEY environment variable is required');
}

const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY));

// Set up clients
const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint

// TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot 
// if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, 
// but it's required to tip Jito to make it work.
// if you don't need Jito you can specify jito=0 or just leave it empty
const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`;

// Create a custom connection for the transaction engine
const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed');

async function sendTransaction() {
    try {
        // Get latest blockhash using RPC client
        const { blockhash } = await rpcClient.getLatestBlockhash();
        console.log(`Got blockhash: ${blockhash}`);

        // Create transfer instruction for sending 0.000001 SOL
        const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient
        
        const transaction = new Transaction();
        transaction.recentBlockhash = blockhash;
        transaction.feePayer = sender.publicKey;

        // Add priority fee 
        transaction.add(
            ComputeBudgetProgram.setComputeUnitPrice({
                microLamports: 1000,
            })
        );

        // Add transfer instruction
        transaction.add(
            SystemProgram.transfer({
                fromPubkey: sender.publicKey,
                toPubkey: receiverPubkey,
                lamports: 1000, // 0.000001 SOL
            })
        );

        // Sign the transaction
        transaction.sign(sender);

        // Send transaction via transaction engine
        console.log(`Sending transaction at ${new Date().toISOString()}`);
        console.log(`Using transaction engine: ${txEngineEndpoint}`);

        const signature = await txEngineConnection.sendRawTransaction(transaction.serialize());
        console.log(`Transaction sent at ${new Date().toISOString()}`);
        console.log(`🎉 SUCCESS! Transaction signature: ${signature}`);

        return signature;
    } catch (error) {
        console.error(`Error: ${error.message}`);
        throw error;
    }
}

// Run the script
sendTransaction()
    .then(signature => {
        console.log('Transaction completed successfully');
        process.exit(0);
    })
    .catch(error => {
        console.error('Transaction failed:', error);
        process.exit(1);
    });

Python (solana-py + solders)

Integration Notes

Integration Notes

No default RPC: we don’t calculate priority fees or recent blockhash. Use your own or public RPC, or email: hello@lumlabs.io for LumLabs RPC quota.

No default RPC: we don’t calculate priority fees or recent blockhash. Use your own or public RPC, or email: hello@lumlabs.io for LumLabs RPC quota.

Jito: append &jito=1 to the Sender URL. You must include your own Jito tip in the transaction; TxEngine doesn’t add or redirect tips, and no tips go to any LumLabs wallet.

Jito: append &jito=1 to the Sender URL. You must include your own Jito tip in the transaction; TxEngine doesn’t add or redirect tips, and no tips go to any LumLabs wallet.

Body: { "transactions": ["BASE64_TX", "..."] } (array of base64-serialized txs).

Body: { "transactions": ["BASE64_TX", "..."] } (array of base64-serialized txs).

Auth & Endpoint: get both in the Telegram bot.

Auth & Endpoint: get both in the Telegram bot.

Query auth param: token=

Query auth param: token=

JavaScript (Node, @solana/web3.js)

const {
    Connection,
    Keypair,
    Transaction,
    SystemProgram,
    PublicKey,
    sendAndConfirmTransaction,
    ComputeBudgetProgram
} = require('@solana/web3.js');
const bs58 = require('bs58');
const axios = require('axios');

// Load your wallet keypair from environment variable that you use to send the transactions from
const SECRET_KEY = process.env.SECRET_KEY;
if (!SECRET_KEY) {
    throw new Error('SECRET_KEY environment variable is required');
}

const sender = Keypair.fromSecretKey(bs58.decode(SECRET_KEY));

// Set up clients
const rpcClient = new Connection("https://api.mainnet-beta.solana.com", 'confirmed'); // For RPC calls, you can use any RPC endpoint

// TXENGINE_HOST and TXENGINE_TOKEN are from the Telegram bot 
// if you're specifying jito=1 the TxEngine will also duplicate the transaction to Jito, 
// but it's required to tip Jito to make it work.
// if you don't need Jito you can specify jito=0 or just leave it empty
const txEngineEndpoint = `https://${process.env.TXENGINE_HOST}?token=${process.env.TXENGINE_TOKEN}&jito=1`;

// Create a custom connection for the transaction engine
const txEngineConnection = new Connection(txEngineEndpoint, 'confirmed');

async function sendTransaction() {
    try {
        // Get latest blockhash using RPC client
        const { blockhash } = await rpcClient.getLatestBlockhash();
        console.log(`Got blockhash: ${blockhash}`);

        // Create transfer instruction for sending 0.000001 SOL
        const receiverPubkey = new PublicKey("SOME_RECIPIENT_PUBLIC_KEY"); // Replace with actual recipient
        
        const transaction = new Transaction();
        transaction.recentBlockhash = blockhash;
        transaction.feePayer = sender.publicKey;

        // Add priority fee 
        transaction.add(
            ComputeBudgetProgram.setComputeUnitPrice({
                microLamports: 1000,
            })
        );

        // Add transfer instruction
        transaction.add(
            SystemProgram.transfer({
                fromPubkey: sender.publicKey,
                toPubkey: receiverPubkey,
                lamports: 1000, // 0.000001 SOL
            })
        );

        // Sign the transaction
        transaction.sign(sender);

        // Send transaction via transaction engine
        console.log(`Sending transaction at ${new Date().toISOString()}`);
        console.log(`Using transaction engine: ${txEngineEndpoint}`);

        const signature = await txEngineConnection.sendRawTransaction(transaction.serialize());
        console.log(`Transaction sent at ${new Date().toISOString()}`);
        console.log(`🎉 SUCCESS! Transaction signature: ${signature}`);

        return signature;
    } catch (error) {
        console.error(`Error: ${error.message}`);
        throw error;
    }
}

// Run the script
sendTransaction()
    .then(signature => {
        console.log('Transaction completed successfully');
        process.exit(0);
    })
    .catch(error => {
        console.error('Transaction failed:', error);
        process.exit(1);
    });

Python (solana-py + solders)

FAQ

FAQ

Is TxEngine really free?

Is TxEngine really free?

How do I enable Jito routing?

How do I enable Jito routing?

Do you calculate priority fees or blockhash for me?

Do you calculate priority fees or blockhash for me?

Legal

Privacy Policy

© 2025 LumLabs

Products & Tools