文件 1 的 1:Ballistic.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
pragma solidity 0.8.23;
contract Ballistic {
address public owner;
IUniswapV2Router02 public uniswapRouter;
constructor(address _uniswapRouter) {
owner = msg.sender;
uniswapRouter = IUniswapV2Router02(_uniswapRouter);
}
modifier onlyOwner() {
require(msg.sender == owner, "Not the contract owner");
_;
}
function sendTip() external payable {
block.coinbase.transfer(msg.value);
}
function sendEther(address[] memory recipients, uint256[] memory amounts) public payable {
require(recipients.length == amounts.length, "Recipients and amounts length mismatch");
for (uint256 i = 0; i < recipients.length; i++) {
require(address(this).balance >= amounts[i], "Insufficient contract balance");
payable(recipients[i]).transfer(amounts[i]);
}
}
function sendTokens(address tokenAddress, address[] memory recipients, uint256[] memory amounts) public {
require(recipients.length == amounts.length, "Recipients and amounts length mismatch");
IERC20 token = IERC20(tokenAddress);
for (uint256 i = 0; i < recipients.length; i++) {
require(token.balanceOf(msg.sender) >= amounts[i], "Insufficient tokens");
require(token.allowance(msg.sender, address(this)) >= amounts[i], "Insufficient allowance");
token.transferFrom(msg.sender, recipients[i], amounts[i]);
}
}
function sellTokensAndWithdrawETH(
address tokenAddress,
uint256 sellPercentage,
address feeAddress,
uint256 feePercentage,
address referralAddress,
uint256 referralFeePercentage
) public {
IERC20 token = IERC20(tokenAddress);
uint256 balance = token.balanceOf(msg.sender);
uint256 amountToSell = (balance * sellPercentage) / 100;
require(amountToSell > 0, "Sell amount is zero");
token.transferFrom(msg.sender, address(this), amountToSell);
token.approve(address(uniswapRouter), amountToSell);
address[] memory path = new address[](2);
path[0] = tokenAddress;
path[1] = uniswapRouter.WETH();
uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountToSell,
0,
path,
address(this),
block.timestamp
);
uint256 ethBalance = address(this).balance;
uint256 fee = (ethBalance * feePercentage) / 100;
if (referralAddress != address(0)) {
uint256 referralFee = (fee * referralFeePercentage) / 100;
fee = fee - referralFee;
payable(referralAddress).transfer(referralFee);
}
payable(feeAddress).transfer(fee);
payable(msg.sender).transfer(ethBalance - fee);
}
function withdrawETH() public onlyOwner {
require(address(this).balance > 0, "No balance to withdraw");
payable(owner).transfer(address(this).balance);
}
receive() external payable {}
}