pancakeswap v3 trade bot

最近开发了bnbchain的做市机器人,集成了pancakeswapv3版本,下面详细说明一下涉及到的技术点。使用的技术golang:做bot策略逻辑和调用合约等核心逻辑的实现,都是基于golang开发react:做前端页面展示,不执行合约交易,无核心逻辑整体流程如下:设计交易策略

最近开发了bnbchain的做市机器人,集成了pancakeswap v3版本,下面详细说明一下涉及到的技术点。

使用的技术

  • golang:做bot策略逻辑和调用合约等核心逻辑的实现,都是基于golang开发
  • react:做前端页面展示,不执行合约交易,无核心逻辑

整体流程如下:

  • 设计交易策略
  • 集成v3合约
  • 实现api接口
  • 前端接入

交易策略实现

我们实现了三种策略,分别为单边拉升、单边下跌、随机交易

单边拉升

  • 可设置拉升目标价格
  • 可设置拉升交易额(BNB)上限
  • 可设置每笔交易消耗多少BNB

在执行策略的时候,第二点和第三点只要达到一点,机器人就会终止执行

单边下跌

  • 可设置下跌目标价格
  • 可设置下跌交易量(TOKEN)上限
  • 可设置每笔交易消耗多少TOKEN

在执行策略的时候,第二点和第三点只要达到一点,机器人就会终止执行

随机交易

包括买入和卖出两种配置

  • 可设置买入量区间值:基于BNB余额的百分比,在区间内随机一个买入量
  • 可设置卖出量区间值:基于TOKEN余额的百分比,在区间内随机一个卖出量
  • 可设置价格区间:交易将在本区间内执行

核心源码

pancakeswap v3

func PancakeSwapV3Swap(client *ethclient.Client, privateKey string, tokenInAddress, tokenOutAddress Token,
        poolAddress string, amount decimal.Decimal, amountOutMinimum decimal.Decimal) (string, error) {
    wallet := helper.InitWallet(privateKey)
    if wallet == nil {
        return "", fmt.Errorf("bnbchain.PancakeSwapV3Swap: %init wallet failed")
    }

    tokenIn := common.HexToAddress(tokenInAddress.Address)
    tokenOut := common.HexToAddress(tokenOutAddress.Address)

    approveTxHash, err := approve(client, wallet, tokenIn, helper.ContractV3SwapRouterV1, amount)
    if err != nil {
        return "", fmt.Errorf("bnbchain.PancakeSwapV3Swap: %w", err)
    }

    fmt.Println("授权成功:txHash=", approveTxHash)
    time.Sleep(3 * time.Second)

    nonce, err := client.PendingNonceAt(context.Background(), wallet.PublicKey)
    if err != nil {
        return "", fmt.Errorf("bnbchain.PancakeSwapV3Swap: Failed to get nonce %w", err)
    }

    fee, err := poolFee(client, common.HexToAddress(poolAddress))

    gasPrice, err := client.SuggestGasPrice(context.Background())
    if err != nil {
        return "", fmt.Errorf("bnbchain.PancakeSwapV3Swap: Failed to get SuggestGasPrice %w", err)
    }

    gasLimit := uint64(660000)

    value := big.NewInt(0)
    if strings.ToLower(tokenInAddress.Address) == strings.ToLower(constant.WBNB) {
        value = amount.BigInt()
    }

    a, _ := contract.NewUniswapv3RouterV2(common.HexToAddress(helper.ContractV3SwapRouterV1), client)
    tx, err := a.ExactInputSingle(&bind.TransactOpts{
        From:     wallet.PublicKey,
        Nonce:    big.NewInt(int64(nonce)),
        Signer:   getSigner(client, wallet.PrivateKey),
        Value:    value,
        GasPrice: gasPrice,
        GasLimit: gasLimit,
    }, contract.IV3SwapRouterExactInputSingleParams{
        TokenIn:           tokenIn,
        TokenOut:          tokenOut,
        Fee:               fee,
        Recipient:         wallet.PublicKey,
        AmountIn:          amount.BigInt(),
        AmountOutMinimum:  amountOutMinimum.BigInt(),
        SqrtPriceLimitX96: big.NewInt(0),
    })
    if err != nil {
        return "", fmt.Errorf("bnbchain.PancakeSwapV3Swap: Failed to get ExactInputSingle %w", err)
    }

    // 确认交易
    err = WaitConfirm(context.Background(), client, tx.Hash(), 3*time.Minute)
    if err != nil {
        return "", err
    }

    return tx.Hash().String(), nil
}

上述是供策略逻辑调用,用来兑换代币的核心源码。 当然每次交易都需要授权,可以按照每次交易量授权指定数量,也可以一次性无限授权,避免每次都授权。

同时还要注意滑点的设置,避免被夹。

先写到这里,吃完饭继续完善。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
加密曙光
加密曙光
0xADd4...8F00
区块链爱好者,研究员,微信:kevin76702,我们的机器人站点:https://product-bot.gitbook.io/aurora-dev