最近开发了bnbchain的做市机器人,集成了pancakeswapv3版本,下面详细说明一下涉及到的技术点。使用的技术golang:做bot策略逻辑和调用合约等核心逻辑的实现,都是基于golang开发react:做前端页面展示,不执行合约交易,无核心逻辑整体流程如下:设计交易策略
最近开发了bnbchain的做市机器人,集成了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
}
上述是供策略逻辑调用,用来兑换代币的核心源码。 当然每次交易都需要授权,可以按照每次交易量授权指定数量,也可以一次性无限授权,避免每次都授权。
同时还要注意滑点的设置,避免被夹。
先写到这里,吃完饭继续完善。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!