bxgateway
v0.1.8
Published
Package for connecting to Bloxroute's gateways
Downloads
8
Maintainers
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: