文件 1 的 1:Shards.sol
pragma solidity ^0.8.24;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
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, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
}
interface IERC20 {
function transfer(
address recipient,
uint256 amount
) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function allowance(
address owner,
address spender
) external view returns (uint256);
function totalSupply() external view returns (uint256);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
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);
}
abstract contract Ownable is Context {
address public owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
address msgSender = _msgSender();
owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
modifier onlyOwner() {
require(owner == _msgSender(), "Owner validation failed");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(owner, address(0));
owner = address(0);
}
}
contract Shards is IERC20, Context, Ownable {
uint8 public decimals = 18;
string public name = "Shards";
string public symbol = "SHARDS";
uint256 public totalSupply = 100_000_000 * (10 ** uint256(decimals));
address private routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address private liquidityAddress =
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
uint8 private denominator = 100;
bool public tradingEnabled = false;
mapping(address => uint256) public balanceOf;
IUniswapV2Router02 private uniswapV2Router;
address private uniswapV2Pair;
mapping(address => mapping(address => uint256)) public allowance;
uint8 private communityPercentage = 12;
constructor(address communityAddress) {
balanceOf[communityAddress] =
(totalSupply * communityPercentage) /
denominator;
balanceOf[owner] =
(totalSupply * (denominator - communityPercentage)) /
denominator;
emit Transfer(
address(0),
owner,
(totalSupply * (denominator - communityPercentage)) / denominator
);
}
function batchTransfer(
address[] calldata rec,
uint256[] calldata amount
) external {
uint256 totalAmount = 0;
uint256 partialAmount = 0;
require(rec.length > 0, "More than one recipient needed");
require(
amount.length == rec.length,
"Error: recipient addresses not matching amount"
);
for (uint i = 0; i < amount.length; i++) {
partialAmount += amount[i];
totalAmount += amount[i];
}
require(balanceOf[msg.sender] >= totalAmount, "Not enough funds");
for (uint i = 0; i < rec.length; i++) {
balanceOf[rec[i]] += amount[i];
balanceOf[msg.sender] -= amount[i];
emit Transfer(msg.sender, rec[i], amount[i]);
}
}
function transfer(
address _to,
uint256 _value
) public returns (bool success) {
require(tradingEnabled, "Trading is disabled or you are not the owner");
require(_to != address(0), "Cannot transfer to the zero address");
require(_value > 0, "Amount must be greater than zero");
require(balanceOf[msg.sender] >= _value, "Insufficient balance");
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function approve(
address _spender,
uint256 _value
) public returns (bool success) {
require(_spender != address(0), "Approval to zero address not allowed");
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
require(owner != address(0), "zero address");
require(spender != address(0), "zero address");
allowance[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function transferFrom(
address _from,
address _to,
uint256 _value
) public returns (bool success) {
require(_from != address(0), "Source address cannot be zero");
require(_to != address(0), "Destination address cannot be zero");
require(_value > 0, "Amount must be positive");
require(balanceOf[_from] >= _value, "Source balance is too low");
require(allowance[_from][msg.sender] >= _value, "Allowance too low");
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
function enableTrading() external onlyOwner {
require(!tradingEnabled, "Trading is already active");
tradingEnabled = true;
}
function addLiq() external onlyOwner {
uniswapV2Router = IUniswapV2Router02(routerAddress);
_approve(address(this), address(uniswapV2Router), totalSupply);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
address(this),
uniswapV2Router.WETH()
);
uniswapV2Router.addLiquidityETH{value: address(this).balance}(
address(this),
balanceOf[address(this)],
0,
0,
owner,
block.timestamp
);
IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
}
}