一、说明
ERC20合约自动抢购套利程序主要是设计架构是采用python处理后端业务逻辑,链上交易通过链端交易接口函数实现代币的自动买入和卖出业务。具体的设计架构如下:
后端:采用python实现实时捕获新创建的流动性资金池对(BNB和USDT对)将新的代币合约按照不同的交易对划拨到不同的数据库表中持久化保存。通过后端的python程序进行轮询处理所有新添加的流动性资金池对,对新上线的代币进行安全性评估(持币地址数量,貔貅,貔貅创建者,买卖税率,黑名单,白名单,可增发,合约所有权,隐藏权限,开源,流动性体量,价格平均波动率,代理合约,最大交易数)指标参数评估。评估完成后满足买入条件的进行最大滑点买入。买入成功后更新相关的数据库列字段,为后续的自动卖出程序提供参考依据。
链端:提供自动买入卖出接口,通过签名验签程序完成request请求的安全性校验。处理代币的自动买入和卖出请求。对合约中的买入,卖出数量以及买卖时机根据当前平均波动率进行最优化决策,确保实现抢购套利的最大化策略。
二、链端自动买卖函数接口
链端自动买卖函数接口是在经过python后端代币的安全性验证和最优化策略决策判断后执行的调用接口,主要实现代币的买卖。将所有的最优化策略逻辑和实际的交易动作分离开来。
代币自动抢购买入接口函数源代码实现(WETH交易对):
function swapExactETHForTokensSupportingFeeOnTransferTokens(address TESTToken, address pairAddress) public returns (bool) {
require(TESTToken != ZERO, "ERC20: TESTToken address is zero");
require(TESTToken != DEAD, "ERC20: TESTToken address is dead");
require(pairAddress != ZERO, "ERC20: PairAddress address is zero");
require(pairAddress != DEAD, "ERC20: PairAddress address is dead");
IERC20 WETH = IERC20(_WETH);
uint256 wethPairBalance = WETH.balanceOf(address(pairAddress));
uint256 _swapInEthAmount;
if(
wethPairBalance >= minPairWETHAmount &&
wethPairBalance <= maxPairWETHAmount
) {
address[] memory path = new address[](2);
path[0] = _uniswapV2Router.WETH();
path[1] = TESTToken;
_uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens(
0, // amountOutMin: accept any amount TESTToken
path,
address(this),
block.timestamp.add(deadlineGap)
);
_swapInEthAmount = swapInETHAmount;
}
emit SwapExactETHForTokensSupportingFeeOnTransferTokens(_swapInEthAmount, getTokenEthPairPrice(TESTToken, pairAddress), block.timestamp);
return true;
}
代币自动抢购卖出接口函数源代码实现(WETH交易对):
function swapExactTokensForETHSupportingFeeOnTransferTokens(address TESTToken, address pairAddress) public returns (bool) {
require(TESTToken != ZERO, "ERC20: TESTToken address is zero");
require(TESTToken != DEAD, "ERC20: TESTToken address is dead");
require(pairAddress != ZERO, "ERC20: PairAddress address is zero");
require(pairAddress != DEAD, "ERC20: PairAddress address is dead");
IERC20 TEST = IERC20(TESTToken);
uint256 TESTBalance = TEST.balanceOf(address(this));
uint256 TESTPairBalance = TEST.balanceOf(address(pairAddress));
if(
TESTBalance > 0 &&
TESTPairBalance > 0
) {
address[] memory path = new address[](2);
path[0] = TESTToken;
path[1] = _uniswapV2Router.WETH();
_uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
TESTBalance,
0, // accept any amount of ETH
path,
address(this),
block.timestamp.add(deadlineGap)
);
}
uint256 ethSwapBalance = address(this).balance;
uint256 swapOutEthAmount = ethSwapBalance > ethInitBalance ? ethSwapBalance.sub(ethInitBalance) : 0 ;
emit SwapExactTokensForETHSupportingFeeOnTransferTokens(swapOutEthAmount, swapOutTESTBalance, getTokenEthPairPrice(TESTToken, pairAddress), block.timestamp);
return true;
}
通过以上链端自动化抢购套利买卖接口,在后端python程序识别到最近套利策略时调用链端接口,执行代币的最近买卖策略以实现收益的最大化。
三、签名验签安全性请求校验核心代码
通过签名验签程序可以有效的验证买卖请求来自于python后端程序,而非其他攻击型模拟请求,从而保证抢购交易池的资金安全性。目前链上有很多恶意请求监听程序,会随时监听各种链上请求,如果无法做到签名验签保证请求的合法来源很容易受到攻击,进而威胁到抢购资金池的安全。
以下为签名验签安全性校验程序核心代码:
function verify(
address _signer,
uint256 amount,
address to,
uint256 _nonce,
bytes memory signature
) internal pure returns (bool) {
bytes32 messageHash = getMessageHash(amount, to, _nonce);
bytes32 ethSignedMessageHash = messageHash.toEthSignedMessageHash();
return ethSignedMessageHash.recover(signature) == _signer;
}
function queryVerify(bytes32 _hashedMessage, uint8 _v, bytes32 _r, bytes32 _s) public pure returns (address) {
bytes32 ethSignedMessageHash = _hashedMessage.toEthSignedMessageHash();
address signer = ecrecover(ethSignedMessageHash, _v, _r, _s);
return signer;
}
function splitSignature(bytes memory sig)
private
pure
returns (
bytes32 r,
bytes32 s,
uint8 v
)
{
require(sig.length == 65, "invalid signature length");
assembly {
// first 32 bytes, after the length prefix
r := mload(add(sig, 32))
// second 32 bytes
s := mload(add(sig, 64))
// final byte (first byte of the next 32 bytes)
v := byte(0, mload(add(sig, 96)))
}
}
function querySignatureParams(
bytes memory _signature
) external pure returns (bytes32, bytes32, uint8) {
(bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
return (r, s, v);
}
至此,完成BSC链上自动抢购套利程序链端买卖接口合约代码实现所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册