bxg

bxgateway

Package for connecting to BloXroute products

Showing:

Popularity

Downloads/wk

21

GitHub Stars

11

Maintenance

Last Commit

3mos ago

Contributors

0

Package

Dependencies

3

License

ISC

Type Definitions

Built-In

Tree-Shakeable

No?

Categories

Readme

Bxgateway

Usage

Installation:

npm install bxgateway

Bloxroute offers many different products, and I separate most of them into different classes. Currently implemented are:

  • Light Gateway (Requires Enterprise plan)
  • Cloud Gateways (Both Enterprise and Non-enterprise)

The Python Gateway is not implemented yet, but it will be soon.

Getting Started

Light Gateway

import { LightGateway } from 'bxgateway';

const gw = new LightGateway(
    'ws://127.0.0.1:28334/ws',
    'YOUR_API_KEY'
);

Cloud Gateway

import { CloudGateway } from 'bxgateway';

const cloudGw = new CloudGateway('wss://api.blxrbdn.com/ws', {
    authorization: 'YOUR_API_KEY'
});

Cloud Gateway (Enterprise)

import { CloudGateway } from 'bxgateway';

const cloudGw = new CloudGateway('wss://eth.feed.blxrbdn.com:28333', {
    certPath: 'path/to/bloxroute/external_gateway/registration_only/external_gateway_cert.pem',
    keyPath: 'path/to/bloxroute/external_gateway/registration_only/external_gateway_key.pem',
});

Sending transactions

We can send transactions like this:

gw.sendTransaction('0xf902ab4d850280bff9a3830...');

sendTransaction accepts a signed transaction (0x-prefixed or not), and submits it to the blxr_tx endpoint of the connection. The result will be emitted as a message:

{ result: '0xfae59fe92511621e6be6932f2aa5232a8371d25779558824c7c2ccae72eb10fb' }

Working with streams

newTxs, pendingTxs and newBlocks streams are supported (the rest are WIP). The newBlocks stream does not work on the Light Gateway yet.

subscribe accepts options that reflect the options provided by Bloxroute, defined by the following interface:

interface StreamOptions {
    filters?: string,
    // Default: all
    include?: Includable[]
    // Default: false
    duplicates?: boolean,
    // Default: true
    includeFromBlockchain?: boolean,
    // Default: Mainnet
    blockchainNetwork?: Network
}

newTxs & pendingTxs

We can build a filter using the Filter class.

import { Filter } from 'bxgateway';

// Filter for watching all transactions to Uniswap V2 & V3 routers.
const filter = new Filter()
    .to('0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D').or.to('0xE592427A0AEce92De3Edee1F18E0157C05861564');

gw.on('open', () => {
    gw.subscribe('newTxs', {
        // Build the filter string
        filters: filter.build(),

        // Possible strings for inclusion are defined in type `Includable`
        include: ['tx_hash', 'tx_contents']
    });
});

gw.on('message', (msg) => {
    doSomething(msg);
});

Example response:

{
  txHash: '0xe0144f121d38beab28b60dceac6194fed161e4d9f2a2748677535c467179ed7e',
  txContents: {
    type: '0x0',
    nonce: '0x24',
    gasPrice: '0x35458af00',
    gas: '0x31a9d',
    value: '0x0',
    input: '0x791ac94700000000000000000000000000000000000000000000001b5dfc94b637631922000000000000000000000000000000000000000000000000004a21e6fd30f7bb00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a157d6bf3675710ec65bfe5069bb38c10cfaed700000000000000000000000000000000000000000000000000000000060bbc1410000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f4a6f4ac07e215484bd9b6fbca0b35ff8005dc52000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
    v: '0x26',
    r: '0xedc7509612b4ac9f71453efc76ec591ff2da01e717e4aaed71513cbd91346565',
    s: '0x6fe401581eca0e32c7888c0182db9f675d08fc47643e85e5066c0c470f336b5f',
    to: '0x7a250d5630b4cf539739df2c5dacb4c659f2488d',
    from: '0xa157d6bf3675710ec65bfe5069bb38c10cfaed70',
    chainId: '0x1',
    hash: '0xe0144f121d38beab28b60dceac6194fed161e4d9f2a2748677535c467179ed7e'
  }
}

MEV Services

To use the MEV services, simply provide the MEV endpoint as an argument to the CloudGateway.

const mevGw = new CloudGateway('https://mev.api.blxrbdn.com', {
    authorization: 'YOUR_API_KEY'
});

const targetBlock = 12575306;

// Raw transactions can be 0x prefixed or not
const sim = await mevGw.simulateBundle(['0xf902ab4d850280bff9a3830...', 'f902ab4d850280bff9a38302d39394e59242...'], targetBlock);

const submission = await mevGw.submitBundle(['0xf902ab4d850280bff9a3830...', 'f902ab4d850280bff9a38302d39394e59242...'], targetBlock);

Both these methods accept the following optional arguments:

type BlockAlias = 'latest' | 'pending';

interface BundleSimulationOptions {
    stateBlockNumber?: number | BlockAlias,
    timestamp?: number
}

interface BundleSubmissionOptions {
    minTimestamp?: number,
    maxTimestamp?: number
}

Debugging

To enable debugging, use the DEBUG environment variable. Example:

DEBUG=* npm run test

Example output: debug-output

Rate & Review

Great Documentation0
Easy to Use0
Performant0
Highly Customizable0
Bleeding Edge0
Responsive Maintainers0
Poor Documentation0
Hard to Use0
Slow0
Buggy0
Abandoned0
Unwelcoming Community0
100