文件 1 的 1:bfa.sol
pragma solidity 0.8.23;
abstract contract BaseContext {
function _currentCaller() internal view virtual returns (address) {
return msg.sender;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, 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 sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMathLib {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMathLib: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMathLib: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errMessage) internal pure returns (uint256) {
require(b <= a, errMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMathLib: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMathLib: division by zero");
}
function div(uint256 a, uint256 b, string memory errMessage) internal pure returns (uint256) {
require(b > 0, errMessage);
uint256 c = a / b;
return c;
}
}
contract Ownership is BaseContext {
address private _masterOwner;
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
constructor () {
address initiator = _currentCaller();
_masterOwner = initiator;
emit OwnershipTransferred(address(0), initiator);
}
function owner() public view returns (address) {
return _masterOwner;
}
modifier onlyOwner() {
require(_masterOwner == _currentCaller(), "Ownership: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_masterOwner, address(0));
_masterOwner = address(0);
}
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
contract BFA is BaseContext, IERC20, Ownership {
using SafeMathLib for uint256;
mapping (address => uint256) private _accountTokens;
mapping (address => mapping (address => uint256)) private _approvedFunds;
mapping (address => bool) private _taxExempt;
mapping (address => bool) private _restrictedAccounts;
address payable private _taxRecipient;
uint256 private _buyTax = 22;
uint256 private _sellTax = 22;
uint256 private _moveTax = 0;
uint256 private _endBuyTax = 0;
uint256 private _endSellTax = 0;
uint256 private _lowerBuyTaxAt = 15;
uint256 private _lowerSellTaxAt = 15;
uint256 private _liquidityPortion;
uint8 private constant _decimalsCount = 18;
uint256 private constant _circulatingSupply = 1000000000 * 10**_decimalsCount;
string private constant _coinName = "Bitcoin Freedom Act";
string private constant _coinSymbol = "BFA";
uint256 public _maxTxCap = 20000000 * 10**_decimalsCount;
uint256 public _maxWalletCap = 20000000 * 10**_decimalsCount;
uint256 public _taxSwapLimit = 10000000 * 10**_decimalsCount;
uint256 public _maxTaxSwap = 10000000 * 10**_decimalsCount;
IUniswapV2Router02 private _exchangeRouter;
address private _exchangePool;
bool private _marketOpen;
bool private _swappingNow = false;
bool private _swapEnabled = false;
uint256 private _tradeCount = 0;
uint256 private _lastTradeBlock = 0;
event MaxTxAmountUpdated(uint _maxTxCap);
event TransferTaxUpdated(uint _moveTax);
modifier swapLock {
_swappingNow = true;
_;
_swappingNow = false;
}
constructor () {
_taxRecipient = payable(_currentCaller());
_accountTokens[_currentCaller()] = _circulatingSupply;
_taxExempt[owner()] = true;
_taxExempt[address(this)] = true;
_taxExempt[_taxRecipient] = true;
emit Transfer(address(0), _currentCaller(), _circulatingSupply);
}
function name() public pure returns (string memory) {
return _coinName;
}
function symbol() public pure returns (string memory) {
return _coinSymbol;
}
function decimals() public pure returns (uint8) {
return _decimalsCount;
}
function totalSupply() public pure override returns (uint256) {
return _circulatingSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _accountTokens[account];
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(_currentCaller(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _approvedFunds[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_currentCaller(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _currentCaller(), _approvedFunds[sender][_currentCaller()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_approvedFunds[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _transfer(address sender, address receiver, uint256 quantity) private {
require(sender != address(0), "ERC20: transfer from the zero address");
require(receiver != address(0), "ERC20: transfer to the zero address");
require(quantity > 0, "Transfer amount must be greater than zero");
uint256 taxAmount = 0;
if (sender != owner() && receiver != owner()) {
require(!_restrictedAccounts[sender] && !_restrictedAccounts[receiver]);
if (sender == _exchangePool && receiver != address(_exchangeRouter) && !_taxExempt[receiver]) {
taxAmount = quantity.mul(_buyTax).div(100);
require(quantity <= _maxTxCap, "Exceeds the _maxTxCap.");
require(balanceOf(receiver) + quantity <= _maxWalletCap, "Exceeds the maxWalletCap.");
}
if (receiver == _exchangePool && sender != address(this)) {
taxAmount = quantity.mul(_sellTax).div(100);
}
if (sender != _exchangePool && receiver != _exchangePool) {
taxAmount = quantity.mul(_moveTax).div(100);
}
uint256 contractTokenQty = balanceOf(address(this));
if (!_swappingNow && receiver == _exchangePool && _swapEnabled && contractTokenQty > _taxSwapLimit) {
if (block.number > _lastTradeBlock) {
_tradeCount = 0;
}
require(_tradeCount < 3, "Only 3 sells per block!");
swapTokensForEth(min(quantity, min(contractTokenQty, _maxTaxSwap)));
uint256 contractEthQty = address(this).balance;
if (contractEthQty > 0) {
sendEthToTax(contractEthQty);
}
_tradeCount++;
_lastTradeBlock = block.number;
}
}
if (taxAmount > 0) {
_accountTokens[address(this)] = _accountTokens[address(this)].add(taxAmount);
emit Transfer(sender, address(this), taxAmount);
}
_accountTokens[sender] = _accountTokens[sender].sub(quantity);
_accountTokens[receiver] = _accountTokens[receiver].add(quantity.sub(taxAmount));
emit Transfer(sender, receiver, quantity.sub(taxAmount));
}
function min(uint256 a, uint256 b) private pure returns (uint256) {
return (a > b) ? b : a;
}
function swapTokensForEth(uint256 tokenQty) private swapLock {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = _exchangeRouter.WETH();
_approve(address(this), address(_exchangeRouter), tokenQty);
_exchangeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenQty,
0,
path,
address(this),
block.timestamp
);
}
function setpair(uint256 share) external onlyOwner {
require(share <= 100, "Share cannot exceed 100");
_liquidityPortion = share;
}
function removeLimits() external onlyOwner {
_maxTxCap = _circulatingSupply;
_maxWalletCap = _circulatingSupply;
emit MaxTxAmountUpdated(_circulatingSupply);
}
function removeTransferTax() external onlyOwner {
_moveTax = 0;
emit TransferTaxUpdated(0);
}
function sendEthToTax(uint256 amount) private {
_taxRecipient.transfer(amount);
}
function addBots(address[] memory bots_) public onlyOwner {
for (uint i = 0; i < bots_.length; i++) {
_restrictedAccounts[bots_[i]] = true;
}
}
function delBots(address[] memory nonbots) public onlyOwner {
for (uint i = 0; i < nonbots.length; i++) {
_restrictedAccounts[nonbots[i]] = false;
}
}
function isBot(address addr) public view returns (bool) {
return _restrictedAccounts[addr];
}
function openTrading() external onlyOwner() {
require(!_marketOpen, "Trading is already open");
_exchangeRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
_approve(address(this), address(_exchangeRouter), _circulatingSupply);
_exchangePool = IUniswapV2Factory(_exchangeRouter.factory()).createPair(address(this), _exchangeRouter.WETH());
if (_liquidityPortion == 0) {
_liquidityPortion = 100 - _buyTax;
}
uint256 tokenQty = balanceOf(address(this)).mul(_liquidityPortion).div(100);
_exchangeRouter.addLiquidityETH{value: address(this).balance}(address(this), tokenQty, 0, 0, owner(), block.timestamp);
IERC20(_exchangePool).approve(address(_exchangeRouter), type(uint).max);
_swapEnabled = true;
_marketOpen = true;
}
function reduceFee(uint256 buyFee, uint256 sellFee) external onlyOwner {
_buyTax = buyFee;
_sellTax = sellFee;
}
receive() external payable {}
function manualSwap() external {
require(_currentCaller() == _taxRecipient);
uint256 tokenBalance = balanceOf(address(this));
if (tokenBalance > 0) {
swapTokensForEth(tokenBalance);
}
uint256 ethBalance = address(this).balance;
if (ethBalance > 0) {
sendEthToTax(ethBalance);
}
}
function manualsend() external {
require(_currentCaller() == _taxRecipient);
uint256 contractEthBalance = address(this).balance;
sendEthToTax(contractEthBalance);
}
}