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.
import { LightGateway } from 'bxgateway';
const gw = new LightGateway(
'ws://127.0.0.1:28334/ws',
'YOUR_API_KEY'
);import { CloudGateway } from 'bxgateway';
const cloudGw = new CloudGateway('wss://api.blxrbdn.com/ws', {
authorization: 'YOUR_API_KEY'
});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',
});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' }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
}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'
}
}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
}To enable debugging, use the DEBUG environment variable. Example:
DEBUG=* npm run test