npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

flashbots-builder

v1.0.2

Published

"Flashbots protocol enables a crypto wallet to submit a sequence of ethereum transactions in one block, away from the prying eyes of frontrunning bots and miners, while being able to pay the gas fee for such transactions with another crypto wallet."

Downloads

17

Readme

Flastbots Transactions Building and Execution Nodejs API

Flashbots protocol enables a crypto wallet to submit a sequence of ethereum transactions in one block, away from the prying eyes of frontrunning bots and miners, while being able to pay the gas fee for such transactions with another crypto wallet.

Build Version GitHub issues GitHub stars GitHub license Total Downloads

Installation

npm install flashbots-builder

With yarn:

yarn add flashbots-builder

Usage

//Get the FlashBot class. Build a bot by instatiating with its constructor,
//or with its FlashBot.Builder() builder static method
const FlashBot = require ("flashbots-builder").default
const { 
    Base, //Transaction request builder base class
    TransferERC20, //ERC20 token transfer transaction request builder class
    Approval721, //ERC721 token approve transaction request builder class
    CryptoKitties, //CryptoKitties transaction request builder class
    urlToJsonRpcProvider, //A method that returns ethersjs, "new providers.JsonRpcBatchProvider(url)"
    urlToStaticJsonRpcProvider //A method that returns ethersjs, "new providers.JsonRpcBatchProvider(url)"
} = require("flashbots-builder")

ES6

import FlashBot, { 
    Base, //Transaction request builder base class
    TransferERC20, //ERC20 token transfer transaction request builder class
    Approval721, //ERC721 token approve transaction request builder class
    CryptoKitties, //CryptoKitties transaction request builder class
    urlToJsonRpcProvider, //A method that returns ethersjs, "new providers.JsonRpcBatchProvider(url)"
    urlToStaticJsonRpcProvider //A method that returns ethersjs, "new providers.JsonRpcBatchProvider(url)"
} from "flashbots-builder"

Examples

Transfer ERC20 token from a wallet with private key at X while paying for gas with the one with private key Y, using the ethereum goerli testnet

const { BigNumber } = require("ethers")
const FlashBot = require ("flashbots-builder").default
const { 
    TransferERC20,
    urlToStaticJsonRpcProvider
} = require("flashbots-builder")

const GWEI = BigNumber.from(10).pow(9)
const PRIORITY_GAS_PRICE = GWEI.mul(31)

FlashBot.Builder()
.addExecutorPrivateKey(X)//The private key of the wallet execute transation(s)
.addSponsorPrivateKey(Y)//The private key of the wallet that pays for the transactio(s)
//Adding transaction(s) to block with number CurrentBlockNumber + 2. Optional. default is 2
.addIntervalToFutureBlock(2)
//The amount of ethers in qwei to add to the current gas price. Optional. default is GWEI.mul(31)
.addPriorityGasPrice(PRIORITY_GAS_PRICE)
.addBlockChainRpcProvider(
    urlToStaticJsonRpcProvider("https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161")
)
.addBundleProviderConnectionInfoOrUrl("https://relay-goerli.flashbots.net")
.addBundleProviderNetwork("goerli")
.addBlockchainNetworkId("5")
.build()
.then(async (flashBot) => {
    //access the sponsor and executor Wallet object
    const sponsor = flashBot.getSponsorWallet()
    const executor = flashBot.getExecutorWallet()

    console.log(`sponsor: ${sponsor.address} | executor: ${executor.address}`)
    
    //The address of the token to transfer
    const TOKEN_ADDRESS_TEST = "0x06e9fdcb45cb817ab102646ab742c1911359a751"
    //create an ERC20 transfer
    const engine = new TransferERC20(
        flashBot.getProvider(),// the rpc provider. Available from the FlashBot insatnce's getProvider method
        executor.address, // the wallet address of the token sender
        sponsor.address, // the wallet address of the token recipient
        TOKEN_ADDRESS_TEST, // the address of the token smart contract
        utils.parseEther("300000") // the amount to transfer with decimals included as a BigNumber
    );
    //get the transaction
    const sponsoredTransactions = await engine.getSponsoredTransactions()

    console.log("Engine Description:", await engine.description())
    console.log("Engine Transaction:\n", sponsoredTransactions)

    const customBuiltTransferRequest = {
        chainId: 5,//Not required. The one in this FlashBot instance will be used if not supplied
        to: TOKEN_ADDRESS_TEST,
        gasLimit: "50000",//Not required. Will be calculated if not supplied
        data: iface.encodeFunctionData("transfer", [
            sponsor.address,
            utils.parseEther("1000000"),
        ]),
        maxFeePerGas: utils.parseUnits("3", "gwei"),//Not required. Will be calculated if not supplied
        maxPriorityFeePerGas: utils.parseUnits("2", "gwei"),//Not required. Will be calculated if not supplied
    }

    const listOfTransferRequest = [ customBuiltTransferRequest, customBuiltTransferRequest, customBuiltTransferRequest]
    const authSignerPrivateKey = null
    //Adding the transactions and executing them as a bundle.
    //Note that you don't have to add a transaction to send the needed ether for the execution. 
    // The needed gas fees will be calculated from all your transactions, and a transaction to 
    // send the total gas fees needed from the sponsor wallet to the executor wallet will be prepended 
    // to all your transactions
    flashBot
    .addMultipleBundleTx(sponsoredTransactions)//add mulitiple transfer request to the transactions bundle
    .addBundleTx(customBuiltTransferRequest)//add a single transfer request to the transactions bundle
    .addMultipleBundleTx(listOfTransferRequest)//add more mulitiple transfer request to the transactions bundle
    .addBundleTx(customBuiltTransferRequest)//add another single transfer request to the transactions bundle
    .execute(authSignerPrivateKey)//If the authSigner is not passed, one will be generated and included in the promise's result
    .then((result) => {
        console.log("result:", result)
        console.log(`Congrats, included in ${result.blockNumber}`)
    })
    .catch(e => {
        console.log("error:", e.message)
    })
})
.catch(e => {
    console.log("error:", e.message)
})

Response

{
    blockNumber: 8662137,//The block number of the block the transaction(s) was/were added to
    //Generated or passed authSignerPrivateKey. If wasn't passed, It's advised to save the returned one 
    // and reuse next time to build up reputaion on the flashbots network
    authSignerKey: "0x3770dc0a8e658b4f334bdca2c9c14a8aa329899ad338c33597366e4bbbde3080",
    //total number of failed targeted blocks before the successfull targeted block.
    totalInclusionFails: 5
}

Credits

Flashbots Ethers.js

Donate

If you find this helpful, consider donating to one of these address:

Ethereum, BNB(BSC), Polygon, any EVM blockchain coin and ERC20 token:

0x7C0E94E471E0408Da5c459A4Cad1c52A5B6CaD8E

BTC

13tDuyKmA6iU24JY7iSEackRmXRjohQdLt