自动交易其实也不是纯全自动, 他至少需要你主动调用函数来执行.
下面就来分析分析他的执行流程.
一个自动交易程序, 首要的条件就是需要一个钱包地址的权限.
和swap最大的不同就在于, 用户只需要点击一次, 后续所有的流程, 包括授权/交易等都会自动执行.
所以第一步需要连接钱包.
可以使用默认的web3 provider, 也可以基于web3-modal等第三方库进行, 这里推荐web3-modal.
用户成功的连接上之后, 有两种方式进行交易:
和传统的swap一样, 基于授权模式的交易
基于私钥的静默交易
这里着重讲解第二条, 基于私钥的自动交易.
我们都知道, 控制一个钱包所有权限的核心就是私钥, 他可以调用任何函数.
在我们拿到私钥之后, 即可签名进行交易, 这里交易分为买和卖, 因为他们的操作略有不同, 所以我们分开来说.
买入交易也分两种情况, 即主网代币买入和其他erc20代币买入.
使用主网代币买入时, 我们可以直接调用swap的swapExactETHForTokens系列api进行交易, 使用web3js的encodeABI得到函数的ABI编码. 进而使用私钥执行签名交易.
let signData = {
nonce,
gasPrice,
gas: 3000000,
to: swap router address
}
const rowTx = pancakeSwapIns.methods.swapExactETHForTokens(0, [主网代币地址, 合约地址], 接受者地址, deadline).encodeABI()
singleData.data = rowTx
const singed = await web3.eth.accounts.signTransaction(signData, 私钥)
await web3.eth.sendSignedTransaction(singed.rawTransaction)
使用其他erc20代币购买时, 逻辑和主网代币购买是一样的, 只是调用的方法从swapExactETHForTokens切换为swapExactTokensForTokens即可.
卖出交易也分为卖出为主网代币或其他erc20代币.
和买入交易不同, 卖出交易的时候, 需要先检测是否授权给合约地址, 必须要授权之后才能卖出.
// 先获取授权数量
const authCount = await tokenContract.methods.allowance(钱包地址, 合约地址).call()
// 如果为0或者小于卖出的数量, 必须重新授权
if(authCount <= 0 || authCount < amount) {
let data = await tokenContract.methods.approve(addresses.PANCAKE_ROUTER, amount).encodeABI()
let isAuth
web3.eth.accounts.signTransaction(tx, key).then(signed => {
web3.eth.sendSignedTransaction(signed.rawTransaction || '').on('receipt', receipt => {
if (receipt.status) {
isAuth = true
} else {
isAuth = false
}
})
})
// 执行卖出
let singedData: any = {
nonce,
from: 钱包地址,
gasPrice,
gas: 3000000,
to: 合约地址
}
const rowTx = pancakeSwapIns.methods.swapExactTokensForETHSupportingFeeOnTransferTokens(amount, 0, [合约地址, 主网代币地址], 接收者地址, deadline).encodeABI()
singleData.data = rowTx
await web3.eth.accounts.signTransaction(singedData, 私钥)
}
以上, 就是调用swap api来进行买入和卖出交易的全部流程, 需要注意的就是, 调用swap api的时候需要使用swap的router合约ABI来初始化合约对象, 否则会报错.
现在市面上大部分的所谓科学家其实都是这样来操作的, 区别就是大家的节点不同而已.
夹子机器人还会有一些额外的判断, 例如针对区块/针对特定地址等, 但是核心逻辑大家都是一样的.
我是eeeth.bnb, 欢迎大家加我的电报@T8888888888888888888888888888, 一起来交流web3技术,