Transaction Hash:
Block:
18632781 at Nov-23-2023 06:56:23 AM +UTC
Transaction Fee:
0.0011422848242463 ETH
$2.41
Gas Used:
46,550 Gas / 24.538879146 Gwei
Emitted Events:
| 313 |
Beg.Approval( owner=[Sender] 0xf40a5dae622b67519522fc352da75fd156dc9ffa, spender=0x00000000...43aC78BA3, value=115792089237316195423570985008687907853269984665640564039457584007913129639935 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
|
0x1f9090aa...8e676c326
Miner
| 2.057478901840094391 Eth | 2.057483556840094391 Eth | 0.000004655 | ||
| 0xbe6bE64e...353efa5f5 | |||||
| 0xF40a5dae...156Dc9ffA |
0.478182305663237405 Eth
Nonce: 98
|
0.477040020838991105 Eth
Nonce: 99
| 0.0011422848242463 |
Execution Trace
Beg.approve( spender=0x000000000022D473030F116dDEE9F6B43aC78BA3, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935 ) => ( True )
approve[Beg (ln:81)]
_approve[Beg (ln:82)]ZeroAddress[Beg (ln:86)]ZeroAddress[Beg (ln:87)]Approval[Beg (ln:89)]
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
// 01000010 01000101 01000111 00100000 01000010 01001001 01010100 01000011 01001000 00100001
import {Ownable} from "./Ownable.sol";
import {SafeERC20} from "./SafeERC20.sol";
import {IERC20} from "./interfaces/IERC20.sol";
import {IUniswapV2Factory} from "./interfaces/IUniswapV2Factory.sol";
import {IUniswapV2Router02} from "./interfaces/IUniswapV2Router02.sol";
contract Beg is Ownable {
string public constant name = "Beg";
string public constant symbol = "BEG";
uint8 public constant decimals = 18;
uint256 public constant totalSupply = 525_600 ether;
address private constant LP_TOKEN_RECIPIENT = 0x588A03B23849E5Bc5C451C6fc696797c608a48e0;
address private constant AIRDROPPER = 0x9a8F6EEF34A4A30763e6eA6e43cDFfdb4913fD36;
address public treasuryWallet = 0x91364516D3CAD16E1666261dbdbb39c881Dbe9eE;
address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
uint8 public constant MAX_BUY_FEES = 100;
uint8 public constant MAX_SELL_FEES = 100;
uint8 public constant TRADING_DISABLED = 0;
uint8 public constant TRADING_ENABLED = 1;
uint8 public buyTotalFees = 20;
uint8 public sellTotalFees = 20;
uint8 public tradingStatus = TRADING_DISABLED;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) private _allowedDuringPause;
mapping(address => bool) private automatedMarketMakerPairs;
mapping(address => uint256) public begged;
IUniswapV2Router02 public constant uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address public immutable uniswapV2Pair;
error ZeroAddress();
error InsufficientAllowance();
error InsufficientBalance();
error CannotRemoveV2Pair();
error WithdrawalFailed();
error InvalidState();
error FeesExceedMax();
error TradingDisabled();
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor() Ownable(LP_TOKEN_RECIPIENT) payable {
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), WETH);
automatedMarketMakerPairs[uniswapV2Pair] = true;
_isExcludedFromFees[owner()] = true;
_isExcludedFromFees[address(this)] = true;
_isExcludedFromFees[treasuryWallet] = true;
_allowedDuringPause[AIRDROPPER] = true;
uint256 begToLP = totalSupply * 25 / 100;
uint256 begToAirdrop = totalSupply - begToLP;
_balances[AIRDROPPER] = begToAirdrop;
emit Transfer(address(0), AIRDROPPER, begToAirdrop);
_balances[address(this)] = begToLP;
emit Transfer(address(0), address(this), begToLP);
_approve(address(this), address(uniswapV2Router), type(uint256).max);
}
function startBegging(uint256 begPerETH) external payable onlyOwner {
uint256 ethToLP = address(this).balance;
uint256 begToLP = begPerETH * address(this).balance;
uint256 begBalance = _balances[address(this)];
if(begToLP > begBalance) {
begToLP = begBalance;
ethToLP = begToLP / begPerETH;
}
uniswapV2Router.addLiquidityETH{value: ethToLP}(
address(this),
begToLP,
0,
0,
LP_TOKEN_RECIPIENT,
block.timestamp
);
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) external returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
if(owner == address(0)) revert ZeroAddress();
if(spender == address(0)) revert ZeroAddress();
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function transfer(address recipient, uint256 amount) external returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool) {
uint256 currentAllowance = _allowances[sender][msg.sender];
if (currentAllowance != type(uint256).max) {
if(currentAllowance < amount) revert InsufficientAllowance();
unchecked {
_approve(sender, msg.sender, currentAllowance - amount);
}
}
_transfer(sender, recipient, amount);
return true;
}
function _transfer(address from, address to, uint256 amount) private {
if(from == address(0)) revert ZeroAddress();
if(to == address(0)) revert ZeroAddress();
if(tradingStatus == TRADING_DISABLED) {
if(from != owner() && from != treasuryWallet && from != address(this) && to != owner()) {
if(!_allowedDuringPause[from]) {
revert TradingDisabled();
}
}
}
bool takeFee = true;
if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
uint256 senderBalance = _balances[from];
if(senderBalance < amount) revert InsufficientBalance();
uint256 fees = 0;
if (takeFee) {
if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
fees = (amount * sellTotalFees) / 1000;
} else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
fees = (amount * buyTotalFees) / 1000;
}
if (fees > 0) {
unchecked {
amount = amount - fees;
_balances[from] -= fees;
_balances[treasuryWallet] += fees;
}
emit Transfer(from, treasuryWallet, fees);
}
}
unchecked {
_balances[from] -= amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
}
function setFees(uint8 _buyTotalFees, uint8 _sellTotalFees) external onlyOwner {
if(_buyTotalFees > MAX_BUY_FEES || _sellTotalFees > MAX_SELL_FEES) revert FeesExceedMax();
buyTotalFees = _buyTotalFees;
sellTotalFees = _sellTotalFees;
}
function setExcludedFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
}
function setAllowedDuringPause(address account, bool allowed) public onlyOwner {
_allowedDuringPause[account] = allowed;
}
function enableTrading() public onlyOwner {
tradingStatus = TRADING_ENABLED;
}
function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
if(pair == uniswapV2Pair) revert CannotRemoveV2Pair();
automatedMarketMakerPairs[pair] = value;
}
function updateTreasuryWallet(address newAddress) external onlyOwner {
if(newAddress == address(0)) revert ZeroAddress();
treasuryWallet = newAddress;
}
function excludedFromFee(address account) public view returns (bool) {
return _isExcludedFromFees[account];
}
function withdrawToken(address token, address to) external onlyOwner {
uint256 _contractBalance = IERC20(token).balanceOf(address(this));
SafeERC20.safeTransfer(token, to, _contractBalance); // Use safeTransfer
}
function withdrawETH(address addr) external onlyOwner {
if(addr == address(0)) revert ZeroAddress();
(bool success, ) = addr.call{value: address(this).balance}("");
if(!success) revert WithdrawalFailed();
}
function beg() external {
unchecked {
++begged[msg.sender];
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
import {IERC20} from "./interfaces/IERC20.sol";
library SafeERC20 {
function safeTransfer(address token, address to, uint256 value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: INTERNAL TRANSFER_FAILED');
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external;
function totalSupply() external view returns(uint256);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
function getPair(address tokenA, address tokenB) external view returns (address pair);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint deadline ) external payable;
function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}