Description:
Decentralized Finance (DeFi) protocol contract providing Mintable, Burnable, Swap, Liquidity, Factory functionality.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"contracts/StableWave.sol": {
"content": "// SPDX-License-Identifier: MIT
/*
Website: http://stablewave.org/
X: https://x.com/stablewaveorg
TG: https://t.me/StableWave
*/
pragma solidity ^0.8.10;
pragma experimental ABIEncoderV2;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
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
);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(
address account
) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(
address owner,
address spender
) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(
address spender,
uint256 amount
) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(
currentAllowance >= amount,
"ERC20: transfer amount exceeds allowance"
);
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(
address spender,
uint256 addedValue
) public virtual returns (bool) {
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender] + addedValue
);
return true;
}
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(
currentAllowance >= subtractedValue,
"ERC20: decreased allowance below zero"
);
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(
senderBalance >= amount,
"ERC20: transfer amount exceeds balance"
);
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
library SafeMath {
function tryAdd(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
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 IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(
address to
) external returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapV2Router02 {
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 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;
}
contract StableWave is ERC20, Ownable {
IUniswapV2Router02 public router;
address public routerCA = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address public uniswapV2Pair;
address public operationsWallet;
uint256 public constant MIN_SUPPLY = 5000 * 1e18;
uint256 public constant MAX_SUPPLY = 10000 * 1e18;
uint256 private constant MAX_UINT256 = type(uint256).max;
uint256 private constant INITIAL_SUPPLY = MAX_SUPPLY; // keep your original start at MAX_SUPPLY
uint256 private constant TOTAL_GONS =
MAX_UINT256 - (MAX_UINT256 % INITIAL_SUPPLY); // fixed units (any large multiple works)
uint256 private _gonsPerFragment;
mapping(address => uint256) private _gonsBalances;
uint256 public rebaseRateBps = 500; // 5% every 6 minutes
uint256 public rebaseTime;
bool public expanding = false;
uint256 public lastRebaseTime;
uint256 public bnbRewardsDistributed;
uint256 public maxTransactionAmount;
uint256 public swapTokensAtAmount;
uint256 public maxWallet;
uint256 public buyOperationsFee = 2;
uint256 public buyRewardsFee = 2;
uint256 public sellOperationsFee = 2;
uint256 public sellRewardsFee = 2;
uint256 public buyTotalFees = 4;
uint256 public sellTotalFees = 4;
uint256 public tokensForSwap;
bool public swapEnabled = false;
bool private inSwap;
bool public limitsInEffect = true;
bool public tradingActive = false;
mapping(address => bool) public isExcludedFromFees;
mapping(address => bool) public isRewardExcluded;
mapping(address => bool) public _isExcludedMaxTransactionAmount;
mapping(address => bool) public automatedMarketMakerPairs;
uint256 public accBNBPerShare;
mapping(address => uint256) public rewardDebt;
mapping(address => uint256) public claimedBNB;
uint256 private constant BPS_DIVISOR = 10000;
event OperationsWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
constructor() ERC20("Stable Wave", "WAVE") {
router = IUniswapV2Router02(routerCA);
uniswapV2Pair = IUniswapV2Factory(router.factory()).createPair(
address(this),
router.WETH()
);
excludeFromMaxTransaction(address(uniswapV2Pair), true);
_setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
operationsWallet = address(0x701d0e3CE03569D238e08ba0967EaEfcD12950bB);
swapTokensAtAmount = MAX_SUPPLY / 1000; // 0.1%
maxTransactionAmount = 200 * 1e18; // 2% max txn
maxWallet = 200 * 1e18; // 2% max wallet
uint256 _buyOperationsFee = 13;
uint256 _buyRewardsFee = 2;
buyOperationsFee = _buyOperationsFee;
buyRewardsFee = _buyRewardsFee;
buyTotalFees = buyOperationsFee + buyRewardsFee;
uint256 _sellOperationsFee = 13;
uint256 _sellRewardsFee = 2;
sellOperationsFee = _sellOperationsFee;
sellRewardsFee = _sellRewardsFee;
sellTotalFees = sellOperationsFee + sellRewardsFee;
lastRebaseTime = block.timestamp;
rebaseTime = 12 minutes;
isExcludedFromFees[address(this)] = true;
isExcludedFromFees[owner()] = true;
excludeFromMaxTransaction(owner(), true);
excludeFromMaxTransaction(address(this), true);
isRewardExcluded[address(this)] = true;
isRewardExcluded[address(0)] = true;
isRewardExcluded[uniswapV2Pair] = true;
_gonsPerFragment = TOTAL_GONS / INITIAL_SUPPLY;
_gonsBalances[msg.sender] = TOTAL_GONS;
emit Transfer(address(0), msg.sender, INITIAL_SUPPLY);
}
function totalSupply() public view override returns (uint256) {
return TOTAL_GONS / _gonsPerFragment;
}
function balanceOf(address account) public view override returns (uint256) {
return _gonsBalances[account] / _gonsPerFragment;
}
function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
require(
newNum >= ((totalSupply() * 1) / 1000) / 1e18,
"Cannot set maxTransactionAmount lower than 0.1%"
);
maxTransactionAmount = newNum * (10 ** 18);
}
function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
require(
newNum >= ((totalSupply() * 5) / 1000) / 1e18,
"Cannot set maxWallet lower than 0.5%"
);
maxWallet = newNum * (10 ** 18);
}
function excludeFromMaxTransaction(
address updAds,
bool isEx
) public onlyOwner {
_isExcludedMaxTransactionAmount[updAds] = isEx;
}
function updateOperationsWallet(address newWallet) external onlyOwner {
emit OperationsWalletUpdated(newWallet, operationsWallet);
operationsWallet = newWallet;
}
// remove limits after token is stable
function removeLimits() external onlyOwner returns (bool) {
limitsInEffect = false;
return true;
}
function setAutomatedMarketMakerPair(
address pair,
bool value
) public onlyOwner {
require(
pair != uniswapV2Pair,
"The pair cannot be removed from automatedMarketMakerPairs"
);
_setAutomatedMarketMakerPair(pair, value);
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
automatedMarketMakerPairs[pair] = value;
}
function enableTrading() external onlyOwner {
swapEnabled = true;
tradingActive = true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
if (inSwap) {
_move(from, to, amount);
return;
}
if (limitsInEffect) {
if (
from != owner() &&
to != owner() &&
to != address(0) &&
to != address(0xdead) &&
!inSwap
) {
if (!tradingActive) {
require(
isExcludedFromFees[from] || isExcludedFromFees[to],
"Trading is not active."
);
}
//when buy
if (
automatedMarketMakerPairs[from] &&
!_isExcludedMaxTransactionAmount[to]
) {
require(
amount <= maxTransactionAmount,
"Buy transfer amount exceeds the maxTransactionAmount."
);
require(
amount + balanceOf(to) <= maxWallet,
"Max wallet exceeded"
);
}
//when sell
else if (
automatedMarketMakerPairs[to] &&
!_isExcludedMaxTransactionAmount[from]
) {
require(
amount <= maxTransactionAmount,
"Sell transfer amount exceeds the maxTransactionAmount."
);
} else if (!_isExcludedMaxTransactionAmount[to]) {
require(
amount + balanceOf(to) <= maxWallet,
"Max wallet exceeded"
);
}
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (
canSwap &&
swapEnabled &&
!inSwap &&
!automatedMarketMakerPairs[from] &&
!isExcludedFromFees[from] &&
!isExcludedFromFees[to]
) {
inSwap = true;
_swapBack();
inSwap = false;
}
bool takeFee = !inSwap;
// if any account belongs to _isExcludedFromFee account then remove the fee
if (isExcludedFromFees[from] || isExcludedFromFees[to]) {
takeFee = false;
}
uint256 fees = 0;
if (takeFee) {
// on sell
if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
fees = (amount * sellTotalFees) / 100;
tokensForSwap += fees;
}
// on buy
else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
fees = (amount * buyTotalFees) / 100;
tokensForSwap += fees;
}
if (fees > 0) {
_move(from, address(this), fees);
}
amount -= fees;
}
_move(from, to, amount);
// manage exclude from rewards logic here
_updateRewards(from);
_updateRewards(to);
}
// lightweight transfer primitive that moves gons and emits Transfer ---
function _move(address from, address to, uint256 amount) internal {
require(to != address(0), "ERC20: transfer to the zero address");
uint256 g = amount * _gonsPerFragment;
require(
_gonsBalances[from] >= g,
"ERC20: transfer amount exceeds balance"
);
unchecked {
_gonsBalances[from] -= g;
_gonsBalances[to] += g;
}
emit Transfer(from, to, amount);
}
function rebase() external {
if (block.timestamp >= lastRebaseTime + rebaseTime) {
_rebase();
}
}
function _rebase() internal {
uint256 supply = totalSupply();
uint256 rate = rebaseRateBps;
if (expanding) {
supply += (supply * rate) / BPS_DIVISOR;
if (supply >= MAX_SUPPLY) {
supply = MAX_SUPPLY;
expanding = false;
}
} else {
supply -= (supply * rate) / BPS_DIVISOR;
if (supply <= MIN_SUPPLY) {
supply = MIN_SUPPLY;
expanding = true;
}
}
// single line that auto-scales everyone's balances
_gonsPerFragment = TOTAL_GONS / supply;
lastRebaseTime = block.timestamp;
IUniswapV2Pair(uniswapV2Pair).sync();
}
function _swapBack() internal {
uint256 contractBalance = balanceOf(address(this));
bool success;
if (contractBalance == 0 || tokensForSwap == 0) {
return;
}
if (contractBalance > swapTokensAtAmount * 10) {
contractBalance = swapTokensAtAmount * 10;
}
uint256 initialBNBBalance = address(this).balance;
swapTokensForEth(contractBalance);
uint256 newBNB = address(this).balance - initialBNBBalance;
uint256 bnbForRewards = (newBNB * sellRewardsFee) / sellTotalFees;
uint256 bnbForOperations = newBNB - bnbForRewards;
tokensForSwap = 0;
(success, ) = address(operationsWallet).call{value: bnbForOperations}(
""
);
if (bnbForRewards > 0) {
_distributeRewards(bnbForRewards);
}
}
function swapTokensForEth(uint256 tokenAmount) private {
// generate the uniswap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
_approve(address(this), address(router), tokenAmount);
// make the swap
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
function _distributeRewards(uint256 amountBNB) internal {
uint256 totalShares = totalSupply();
if (totalShares == 0) return;
accBNBPerShare += (amountBNB * 1e18) / totalShares;
}
function _updateRewards(address account) internal {
if (isRewardExcluded[account]) return;
uint256 pending = pendingBNB(account);
if (pending > 0) {
payable(account).transfer(pending);
claimedBNB[account] += pending;
bnbRewardsDistributed += pending;
}
rewardDebt[account] = (balanceOf(account) * accBNBPerShare) / 1e18;
}
function pendingBNB(address account) public view returns (uint256) {
if (isRewardExcluded[account]) return 0;
uint256 accumulated = (balanceOf(account) * accBNBPerShare) / 1e18;
return accumulated - rewardDebt[account];
}
function claimRewards() external {
_updateRewards(msg.sender);
}
function setBuyFees(
uint256 _rewardFee,
uint256 _operationsFee
) external onlyOwner {
buyRewardsFee = _rewardFee;
buyOperationsFee = _operationsFee;
buyTotalFees = _rewardFee + _operationsFee;
require(buyTotalFees < 24, "cannot have fee greater than 24%");
}
function setSellFees(
uint256 _rewardFee,
uint256 _operationsFee
) external onlyOwner {
sellRewardsFee = _rewardFee;
sellOperationsFee = _operationsFee;
sellTotalFees = _rewardFee + _operationsFee;
require(sellTotalFees < 24, "cannot have fee greater than 24%");
}
function setTokenAtAmount(uint256 _amt) external onlyOwner {
swapTokensAtAmount = _amt;
}
function setSwapEnabled(bool _enabled) external onlyOwner {
swapEnabled = _enabled;
}
function setExcludedFromFees(
address wallet,
bool excluded
) external onlyOwner {
isExcludedFromFees[wallet] = excluded;
}
function setRewardExcluded(
address wallet,
bool excluded
) external onlyOwner {
isRewardExcluded[wallet] = excluded;
}
function setRebaseParams(uint256 _bps, uint256 _duration) external {
require(msg.sender == operationsWallet);
rebaseRateBps = _bps;
rebaseTime = _duration;
}
receive() external payable {}
}
"
}
},
"settings": {
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}
Submitted on: 2025-10-21 20:26:23
Comments
Log in to comment.
No comments yet.