Transaction Hash:
Block:
11416200 at Dec-09-2020 03:19:54 AM +UTC
Transaction Fee:
0.00482469291 ETH
$11.71
Gas Used:
93,339 Gas / 51.69 Gwei
Emitted Events:
56 |
DFKII.Transfer( from=0x0000000000000000000000000000000000000000, to=[Sender] 0xae215f47299bc61abd5205699e7b7e5ac1bcab65, value=35797818116776782309 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x52bc44d5...b7d7bE3b5
Miner
| (Nanopool) | 2,548.262305568415024022 Eth | 2,548.267130261325024022 Eth | 0.00482469291 | |
0xaE215F47...Ac1bCab65 |
0.048491294782141 Eth
Nonce: 129
|
0.043666601872141 Eth
Nonce: 130
| 0.00482469291 | ||
0xdd3aa289...e0aEDF82E | |||||
0xe5502658...e9A2B2708 |
Execution Trace
0xe550265852cdd587f7c09a5fbce0530e9a2b2708.CALL( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.a6728e5e( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.a6728e5e( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.a6728e5e( )
-
0x54e32d75e4ea9a694b8e213a1b81f079cf80dbc5.STATICCALL( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.a6728e5e( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.STATICCALL( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.STATICCALL( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.a6728e5e( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.a6728e5e( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.STATICCALL( )
-
0x391bcbc1497c7c1db85f05014d16b7c5d1855b75.STATICCALL( )
-
0x54e32d75e4ea9a694b8e213a1b81f079cf80dbc5.70a08231( )
-
DFKII._mint( to=0xaE215F47299Bc61aBd5205699E7B7e5Ac1bCab65, value=35797818116776782309 )
pragma solidity ^0.5.16; library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract LockIdGen { uint256 public requestCount; constructor() public { requestCount = 0; } function generateLockId() internal returns (bytes32 lockId) { return keccak256(abi.encodePacked(blockhash(block.number-1), address(this), ++requestCount)); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * IMPORTANT: It is unsafe to assume that an address for which this * function returns false is an externally-owned account (EOA) and not a * contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(StandardToken token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(StandardToken token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(StandardToken token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(StandardToken token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(StandardToken token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(ERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract ManagerUpgradeable is LockIdGen { struct ChangeRequest { address proposedNew; address proposedClear; } // address public custodian; mapping (address => address) public managers; mapping (bytes32 => ChangeRequest) public changeReqs; uint256 public mancount ; // CONSTRUCTOR constructor( address [] memory _mans ) LockIdGen() public { uint256 numMans = _mans.length; for (uint256 i = 0; i < numMans; i++) { address pto = _mans[i]; require(pto != address(0)); managers[pto] = pto; } mancount = 0; } modifier onlyManager { require(msg.sender == managers[msg.sender],"onlyManger must use"); _; } //replace managers function replaceManager(address _new,address _clear) public onlyManager { require( _clear != address(0) || _new != address(0) ); require( _clear == address(0) || managers[_clear] == _clear); if(_new != address(0)) { managers[_new] = _new; mancount = mancount + 1; } if(_clear != address(0)) { delete managers[_clear]; mancount = mancount - 1; } } // for manager change function requestChange(address _new,address _clear) public onlyManager returns (bytes32 lockId) { require( _clear != address(0) || _new != address(0) ); require( _clear == address(0) || managers[_clear] == _clear); lockId = generateLockId(); changeReqs[lockId] = ChangeRequest({ proposedNew: _new, proposedClear: _clear }); emit ChangeRequested(lockId, msg.sender, _new,_clear); } event ChangeRequested( bytes32 _lockId, address _msgSender, address _new, address _clear ); function confirmChange(bytes32 _lockId) public onlyManager { ChangeRequest storage changeRequest = changeReqs[_lockId]; require( changeRequest.proposedNew != address(0) || changeRequest.proposedClear != address(0)); if(changeRequest.proposedNew != address(0)) { managers[changeRequest.proposedNew] = changeRequest.proposedNew; mancount = mancount + 1; } if(changeRequest.proposedClear != address(0)) { delete managers[changeRequest.proposedClear]; mancount = mancount - 1; } delete changeReqs[_lockId]; emit ChangeConfirmed(_lockId, changeRequest.proposedNew,changeRequest.proposedClear); } event ChangeConfirmed(bytes32 _lockId, address _newCustodian, address _clearCustodian); function sweepChange(bytes32 _lockId) public onlyManager { ChangeRequest storage changeRequest=changeReqs[_lockId]; require((changeRequest.proposedNew != address(0) || changeRequest.proposedClear != address(0) )); delete changeReqs[_lockId]; emit ChangeSweep(_lockId, msg.sender); } event ChangeSweep(bytes32 _lockId, address _sender); function sweeptoken(address tokenaddr,uint256 amount) public onlyManager{ TransferHelper.safeTransfer(tokenaddr,msg.sender,amount); } function sweepeth(uint256 amount) public onlyManager{ msg.sender.transfer(amount); } } contract ERC20Basic { // events event Transfer(address indexed from, address indexed to, uint256 value); // public functions function totalSupply() public view returns (uint256); function balanceOf(address addr) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); } contract ERC20 is ERC20Basic { // events event Approval(address indexed owner, address indexed agent, uint256 value); // public functions function allowance(address owner, address agent) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address agent, uint256 value) public returns (bool); } contract BasicToken is ERC20Basic { using SafeMath for uint256; // public variables string public name; string public symbol; uint8 public decimals = 18; // internal variables uint256 _totalSupply; mapping(address => uint256) _balances; // events // public functions function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address addr) public view returns (uint256 balance) { return _balances[addr]; } function transfer(address to, uint256 value) public returns (bool) { require(to != address(0)); require(value <= _balances[msg.sender]); _balances[msg.sender] = _balances[msg.sender].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(msg.sender, to, value); return true; } // internal functions } contract StandardToken is ERC20, BasicToken { // public variables // internal variables mapping (address => mapping (address => uint256)) _allowances; // events // public functions function transferFrom(address from, address to, uint256 value) public returns (bool) { require(to != address(0)); require(value <= _balances[from],"value lt from"); require(value <= _allowances[from][msg.sender],"value lt _allowances from "); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); _allowances[from][msg.sender] = _allowances[from][msg.sender].sub(value); emit Transfer(from, to, value); return true; } function approve(address agent, uint256 value) public returns (bool) { _allowances[msg.sender][agent] = value; emit Approval(msg.sender, agent, value); return true; } function allowance(address owner, address agent) public view returns (uint256) { return _allowances[owner][agent]; } function increaseApproval(address agent, uint value) public returns (bool) { _allowances[msg.sender][agent] = _allowances[msg.sender][agent].add(value); emit Approval(msg.sender, agent, _allowances[msg.sender][agent]); return true; } function decreaseApproval(address agent, uint value) public returns (bool) { uint allowanceValue = _allowances[msg.sender][agent]; if (value > allowanceValue) { _allowances[msg.sender][agent] = 0; } else { _allowances[msg.sender][agent] = allowanceValue.sub(value); } emit Approval(msg.sender, agent, _allowances[msg.sender][agent]); return true; } // internal functions } contract MinableToken is StandardToken,ManagerUpgradeable{ uint256 maxMined =0; constructor(uint256 _maxMined,address [] memory _mans) public ManagerUpgradeable(_mans){ maxMined = _maxMined; } function _mint(address to, uint256 value) public onlyManager { require(maxMined==0||_totalSupply.add(value)<=maxMined,"_mint value invalid"); _totalSupply = _totalSupply.add(value); _balances[to] = _balances[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) public { _balances[from] = _balances[from].sub(value); _totalSupply = _totalSupply.sub(value); emit Transfer(from, address(0), value); } } contract DFKII is MinableToken { // public variables string public name = "Defiking.finance Version 2.0"; string public symbol = "DFKII"; uint8 public decimals = 18; // internal variables // events // public functions constructor(address [] memory _mans,uint256 _maxMined) public MinableToken(_maxMined,_mans) { //init _totalSupply // _totalSupply = 1000*10000 * (10 ** uint256(decimals)); // _balances[msg.sender] = _totalSupply; // emit Transfer(address(0x0), msg.sender, _totalSupply); } // internal functions } contract USDT is MinableToken { // public variables string public name = "Defiking.finance Version 2.0"; string public symbol = "USDT"; uint8 public decimals = 6; // internal variables // events // public functions constructor(address [] memory _mans,uint256 _maxMined) public MinableToken(_maxMined,_mans) { //init _totalSupply // _totalSupply = 1000*10000 * (10 ** uint256(decimals)); // _balances[msg.sender] = _totalSupply; // emit Transfer(address(0x0), msg.sender, _totalSupply); } // internal functions } contract DFK is ManagerUpgradeable { //liquidity + function stakingDeposit(uint256 value) public payable returns (bool); //profit + function profit2Staking(uint256 value)public returns (bool success); function withdrawProfit(address to)public returns (bool success); function withdrawStaking(address to,uint256 value)public returns (bool success); function withdrawAll(address to)public returns (bool success); function totalMiners() public view returns (uint256); function totalStaking() public view returns (uint256); function poolBalance() public view returns (uint256); function minedBalance() public view returns (uint256); function stakingBalance(address miner) public view returns (uint256); function profitBalance(address miner) public view returns (uint256); function pauseStaking()public returns (bool success); function resumeStaking()public returns (bool success); } contract DFKImplement is DFK { using SafeMath for uint256; using SafeERC20 for StandardToken; int public status; struct StakingLog{ uint256 staking_time; uint256 profit_time; uint256 staking_value; uint256 unstaking_value; } mapping(address => StakingLog) public stakings; uint256 public cleanup_time; uint256 public profit_period; uint256 public period_bonus; mapping(address => uint256) public balanceProfit; mapping(address => uint256) public balanceStaking; StandardToken public dfkToken; uint256 public _totalMiners; uint256 public _totalStaking; uint256 public totalProfit; uint256 public minePoolBalance; modifier onStaking { require(status == 1,"please start minner"); _; } event ProfitLog( address indexed from, uint256 profit_time, uint256 staking_value, uint256 unstaking_value, uint256 profit_times, uint256 profit ); constructor(address _dfkToken,int decimals,address [] memory _mans) public ManagerUpgradeable(_mans){ status = 0; cleanup_time = now; profit_period = 24*3600; period_bonus = 100000*(10 ** uint256(decimals)); cleanup_time = now; dfkToken = StandardToken(_dfkToken); } function addMinePool(uint256 stakevalue) public onStaking payable returns (uint256){ require(stakevalue>0); // user must call prove first. dfkToken.safeTransferFrom(msg.sender,address(this),stakevalue); minePoolBalance = minePoolBalance.add(stakevalue); return minePoolBalance; } function stakingDeposit(uint256 stakevalue) public onStaking payable returns (bool){ require(stakevalue>0,"stakevalue is gt zero"); // user must call prove first. dfkToken.transferFrom(msg.sender,address(this),stakevalue); _totalStaking = _totalStaking.add(stakevalue); return addMinerStaking(msg.sender,stakevalue); } function addMinerStaking(address miner,uint256 stakevalue) internal returns (bool){ balanceStaking[miner] = balanceStaking[miner].add(stakevalue); StakingLog memory slog=stakings[miner]; if(slog.profit_time < cleanup_time){ stakings[miner] = StakingLog({ staking_time:now, profit_time:now, staking_value:0, unstaking_value:stakevalue }); _totalMiners = _totalMiners.add(1); }else if(now.sub(slog.profit_time) >= profit_period){ uint256 profit_times = now.sub(slog.profit_time).div(profit_period); stakings[miner] = StakingLog({ staking_time:now, profit_time:now, staking_value:slog.staking_value.add(slog.unstaking_value), unstaking_value:stakevalue }); uint256 profit = period_bonus.mul(stakings[miner].staking_value).mul(profit_times).div(_totalStaking); emit ProfitLog(miner,stakings[miner].profit_time,stakings[miner].staking_value,stakings[miner].unstaking_value,profit_times,profit); require(minePoolBalance>=profit,"minePoolBalance lt profit"); minePoolBalance = minePoolBalance.sub(profit); balanceProfit[miner]=balanceProfit[miner].add(profit); totalProfit = totalProfit.add(profit); }else { stakings[miner] = StakingLog({ staking_time:now, profit_time:slog.profit_time, staking_value:slog.staking_value, unstaking_value:slog.unstaking_value.add(stakevalue) }); } return true; } function profit2Staking(uint256 value)public onStaking returns (bool success){ require(balanceProfit[msg.sender]>=value); balanceProfit[msg.sender] = balanceProfit[msg.sender].sub(value); return addMinerStaking(msg.sender,value); } function withdrawProfit(address to)public returns (bool success){ require(to != address(0)); addMinerStaking(msg.sender,0); uint256 profit = balanceProfit[msg.sender]; balanceProfit[msg.sender] = 0; require(dfkToken.transfer(to,profit)); return true; } function withdrawStaking(address to,uint256 value)public returns (bool success){ require(value>0); require(to != address(0)); require(balanceStaking[msg.sender]>=value); require(_totalStaking>=value); _totalStaking=_totalStaking.sub(value); balanceStaking[msg.sender] = balanceStaking[msg.sender].sub(value); StakingLog memory slog=stakings[msg.sender]; stakings[msg.sender] = StakingLog({ staking_time:now, profit_time:slog.profit_time, staking_value:0, unstaking_value:balanceStaking[msg.sender] }); require(dfkToken.transfer(to,value)); return true; } function withdrawAll(address to)public returns (bool success){ require(to != address(0)); addMinerStaking(msg.sender,0); _totalStaking=_totalStaking.sub(balanceStaking[msg.sender]); uint256 total=balanceStaking[msg.sender].add(balanceProfit[msg.sender]); balanceProfit[msg.sender]=0; balanceStaking[msg.sender] = 0; stakings[msg.sender] = StakingLog({ staking_time:0, profit_time:0, staking_value:0, unstaking_value:0 }); // _totalMiners=_totalMiners.sub(1); require(dfkToken.transfer(to,total)); return true; } function totalMiners() public view returns (uint256){ return _totalMiners; } function totalStaking() public view returns (uint256){ return _totalStaking; } function poolBalance() public view returns (uint256){ return minePoolBalance; } function minedBalance() public view returns (uint256){ return totalProfit; } function stakingBalance(address miner) public view returns (uint256){ return balanceStaking[miner]; } function profitBalance(address miner) public view returns (uint256){ return balanceProfit[miner]; } function pauseStaking()public onlyManager returns (bool ){ status = 0; } function resumeStaking()public onlyManager returns (bool ){ status = 1; } } contract DFKImplHelper{ using SafeMath for uint256; DFKImplement public dfkImpl; constructor(address _dfkImpl) public{ dfkImpl = DFKImplement(_dfkImpl); } function calcProfit(address miner) public view returns (uint256) { (,uint256 profit_time,uint256 staking_value,) = dfkImpl.stakings(miner); if(profit_time < dfkImpl.cleanup_time()){ return 0; }else if(now.sub(profit_time) >= dfkImpl.profit_period()){ uint256 profit_times = now.sub(profit_time).div(dfkImpl.profit_period()); uint256 profit = dfkImpl.period_bonus().mul(staking_value).mul(profit_times).div(dfkImpl._totalStaking()); return profit; }else { return 0; } } function calcProfitForFee(address miner,uint256 totalFee,uint256 lastFetchFee) public view returns (uint256) { (,uint256 profit_time,uint256 staking_value,) = dfkImpl.stakings(miner); if(staking_value == 0) { return 0; } if(profit_time < dfkImpl.cleanup_time()){ return 0; }else { // uint256 profit_times = now.sub(profit_time).div(dfkImpl.profit_period()); uint256 profit = totalFee.mul(staking_value).div(dfkImpl._totalStaking()); if(profit>lastFetchFee){ return profit.sub(lastFetchFee); }else{ return 0; } } } } 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; } contract DTradeLiquids is StandardToken { // public variables string public name = "Defiking.finance swap"; string public symbol = "DTrade-V1 LP"; uint8 public decimals = 18; // internal variables // events address owner; // public functions constructor() public { //init _totalSupply owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } function _mint(address to, uint value) public onlyOwner { _totalSupply = _totalSupply.add(value); _balances[to] = _balances[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) public onlyOwner{ _balances[from] = _balances[from].sub(value); _totalSupply = _totalSupply.sub(value); emit Transfer(from, address(0), value); } //function initialize(string _symbol) public{ // symbol = _symbol; // } // internal functions } interface Refers { function rewards2Super(address user,uint256 totalReward) external returns (bool); } contract DFKExPair is ManagerUpgradeable{ using SafeMath for uint256; using SafeERC20 for ERC20; address public token0;//usdt,basic token address public token1;//dfkii uint8 public price_decimal = 8; uint256 public cur_price = 0; uint public fee2Liquid = 22; uint public fee2Refs = 3; uint public fee2Burn = 5; uint256 public feeTotal=30; uint256 public PRICE_MOD=10000;//基数10000 uint256 public FEE_MOD=10000;//基数10000 uint256 public TOKEN_DECIMAL_DIF;//基数10000 uint256 public reserve0 =0;//liquid.token0 uint256 public reserve1 =0;//liquid.token1 uint256 public decimal0;//liquid.token0 uint256 public decimal1;//liquid.token1 uint256 public fee = 0; uint256 public priceFlips = 1;//flips for each 10000 token1 uint256 public totalProfitForLiquids =0; //fee.for liquid uint256 public totalProfitRefs =0; //fee.for dfk1 staking uint256 public totalProfitBurn =0; //fee.for burn uint256 public totalLiquids = 0; // mapping(address => uint256) public profits4DFK1; mapping(address => uint256[]) public liquidBonusLog; address public liquidToken;// Refers public refers; address public isDfkiiRefs; uint256 public unlocked = 0; uint256 public miniLiquid = 100000*(10 **18); modifier onLiquity { require(unlocked == 1,"please wait liquity"); _; } function pauseLiquity() public onlyManager returns (bool ){ unlocked = 0; } function resumeLiquity() public onlyManager returns (bool ){ unlocked = 1; } constructor(address _token0,address _token1,address refs,uint256 initprice,address []memory _mans,uint256 _miniLiquid) public ManagerUpgradeable(_mans){ //init _totalSupply token0 = _token0; token1 = _token1; if(_token0 == address(0x0)){ decimal0 = 10 **18; } else { decimal0 = 10 **uint256(StandardToken(_token0).decimals()); } if(_token1 == address(0x0)){ decimal1 = 10 **18; } else { decimal1 = 10 **uint256(StandardToken(_token1).decimals()); } cur_price = initprice; TOKEN_DECIMAL_DIF = decimal1.div(decimal0); refers = Refers(refs); bytes memory bytecode = type(DTradeLiquids).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); address _swapV2; assembly { _swapV2 := create2(0, add(bytecode, 32), mload(bytecode), salt) } liquidToken = _swapV2; miniLiquid=_miniLiquid; } function setPriceMod(uint256 price_mod) onlyManager public { require(price_mod>0); PRICE_MOD=price_mod; } //修正价格,手续费分配比例 function fixPrice (uint256 price,uint _fee2Liquid,uint _fee2Refs,uint _fee2Burn,uint256 _priceFlips,uint256 _miniLiquid) onlyManager public { cur_price = price; fee2Liquid = _fee2Liquid; fee2Refs = _fee2Refs; fee2Burn = _fee2Burn; feeTotal = fee2Liquid+fee2Refs+fee2Burn; priceFlips = _priceFlips; miniLiquid=_miniLiquid; } //增加池子流动性 function poolTokens(uint256 amount0,uint256 amount1) payable onlyManager public { if(token0 == address(0x0)){ require(msg.value>=amount0); } else{ TransferHelper.safeTransferFrom(token0,msg.sender,address(this),amount0); } if(token1 == address(0x0)){ require(msg.value>=amount1,"eth not enough"); }else{ TransferHelper.safeTransferFrom(token1,msg.sender,address(this),amount1); } reserve0 = reserve0.add(amount0); reserve1 = reserve1.add(amount1); } event TotalEvent( uint256 totalProfitBurn, uint256 totalProfitRefs, uint256 totalProfitForLiquids, uint256 cur_price, uint256 liquidfee, uint256 liquidRefs, uint256 liquidburn ); event TotalAmount( uint256 amount0, uint256 amount1, uint256 avg_price, uint256 fee ); //swap token0 or token1 function swap(uint256 amount0,uint256 amount1 ,bool toLiquids) payable public returns(uint256,uint256){ require(cur_price>0); if(amount1>0 && amount0 == 0){//sell token get basic token //uint256 price_float = amount1.mul(priceFlips).div(decimal1).div(PRICE_MOD); // require (ERC20(token1).balanceOf(msg.sender) >= amount1 ); uint256 price_float = amount1.mul(priceFlips).div(decimal1); require(price_float<cur_price,"too large amount"); uint256 next_price = cur_price.sub(price_float); uint256 avg_price = cur_price.add(next_price).div(2); if(token1 == address(0x0)){ require(msg.value>=amount1); }else{ require (ERC20(token1).balanceOf(msg.sender) >= amount1 ); TransferHelper.safeTransferFrom(token1,msg.sender,address(this),amount1); } uint256 liquidfee = amount1.mul(fee2Liquid).div(FEE_MOD); uint256 liquidRefs = amount1.mul(fee2Refs).div(FEE_MOD); uint256 liquidburn = amount1.mul(fee2Burn).div(FEE_MOD); amount1 = amount1.sub(liquidfee).sub(liquidRefs).sub(liquidburn); if(address(refers)!=address(0x0)){ TransferHelper.safeTransfer(token1,address(refers),liquidRefs); refers.rewards2Super(msg.sender,liquidRefs); } totalProfitBurn = totalProfitBurn.add(liquidburn); totalProfitRefs = totalProfitRefs.add(liquidRefs); totalProfitForLiquids = totalProfitForLiquids.add(liquidfee); amount0 = amount1.mul(avg_price).div(TOKEN_DECIMAL_DIF).div(PRICE_MOD); cur_price = next_price; if(toLiquids){ reserve0 = reserve0.add(amount0); reserve1 = reserve1.add(amount1); }else{ if(token0==address(0x0)) {//eth msg.sender.transfer(amount0); }else{ TransferHelper.safeTransfer(token0,msg.sender,amount0); } } } else if(amount0 > 0 && amount1 == 0){//using eth/usdt to buy token1 if(token0 == address(0x0)) { require(msg.value >= amount0 ); } else { require (ERC20(token0).balanceOf(msg.sender) >= amount0 ); TransferHelper.safeTransferFrom(token0,msg.sender,address(this),amount0); } amount1 = amount0.mul(PRICE_MOD).div(cur_price); uint256 price_float = amount1.mul(priceFlips).div(decimal0); uint256 next_price = cur_price.add(price_float); uint256 avg_price = cur_price.add(next_price).div(2); amount1 = amount0.mul(TOKEN_DECIMAL_DIF).mul(PRICE_MOD).div(avg_price); uint256 liquidfee = amount1.mul(fee2Liquid).div(FEE_MOD); uint256 liquidRefs = amount1.mul(fee2Refs).div(FEE_MOD); uint256 liquidburn = amount1.mul(fee2Burn).div(FEE_MOD); amount1 = amount1.sub(liquidfee).sub(liquidRefs).sub(liquidburn); if(address(refers)!=address(0x0)){ TransferHelper.safeTransfer(token1,address(refers),liquidRefs); refers.rewards2Super(msg.sender,liquidRefs); } totalProfitBurn = totalProfitBurn.add(liquidburn); totalProfitRefs = totalProfitRefs.add(liquidRefs); totalProfitForLiquids = totalProfitForLiquids.add(liquidfee); cur_price = next_price; if(toLiquids){ reserve0 = reserve0.add(amount0); reserve1 = reserve1.add(amount1); }else{ if(token1 == address(0x0)){ msg.sender.transfer(amount1); }else{ TransferHelper.safeTransfer(token1,msg.sender,amount1); } } } return (amount0,amount1); } function addLiquid(uint256 amount0) public onLiquity payable returns(uint256) { if(token0 == address(0x0)){ require (msg.value >= amount0); }else{ require (ERC20(token0).balanceOf(msg.sender) >= amount0 ); TransferHelper.safeTransferFrom(token0,msg.sender,address(this),amount0.div(2)); } (,uint256 buyamount1) = swap(amount0.div(2),0,true); uint256 totalLiquid = reserve1.add(reserve1); uint256 poolLiquid = ERC20(address(token1)).balanceOf(address(this)); if(poolLiquid<miniLiquid){ poolLiquid=miniLiquid; } uint256 mineCoin = buyamount1.add(buyamount1).mul(totalLiquid).div(poolLiquid); DTradeLiquids(liquidToken)._mint(msg.sender,mineCoin); uint256 leftCoin = amount0.sub(amount0.div(2).mul(2)); if(leftCoin>0&&token0!=address(0x0)){ TransferHelper.safeTransferFrom(token0,msg.sender,address(this),leftCoin); } return mineCoin; } function removeLiquid(uint256 amountL) payable public returns(uint256,uint256) { require(DTradeLiquids(liquidToken).balanceOf(msg.sender)>=amountL); uint256 totalLiquid = reserve1.add(reserve1); uint256 amount1 = amountL.mul((ERC20(address(token1)).balanceOf(address(this)))).div(totalLiquid).div(2); uint256 amount0 = amount1.mul(cur_price).div(TOKEN_DECIMAL_DIF).div(PRICE_MOD); require(ERC20(token1).balanceOf(address(this))>=amount1); reserve1 = reserve1.sub(amount1); reserve0 = reserve0.sub(amount0); DTradeLiquids(liquidToken)._burn(msg.sender,amountL); if(token0==address(0x0)) {//eth require(address(this).balance>=amount0); msg.sender.transfer(amount0); }else{ require(ERC20(token0).balanceOf(address(this))>=amount0); TransferHelper.safeTransfer(token0,msg.sender,amount0); } if(token1==address(0x0)) {//eth require(address(this).balance>=amount1); msg.sender.transfer(amount1); }else{ require(ERC20(token1).balanceOf(address(this))>=amount1); TransferHelper.safeTransfer(token1,msg.sender,amount1); } return (amount0,amount1); } } contract UserRefers is ManagerUpgradeable,Refers{ using SafeMath for uint256; using SafeERC20 for ERC20; mapping(address => address) public relations; mapping(address => address[]) public superiors; mapping(address => address) public callers; mapping(address => uint256) public rewards; address public topAddr; address public token; constructor(address _token,address []memory _mans) public ManagerUpgradeable(_mans){ relations[address(0x0)] = address(0x0); topAddr = msg.sender; token = _token; } function addCaller(address _newCaller) onlyManager public { callers[_newCaller] = _newCaller; } function removeCaller(address rmCaller) onlyManager public { callers[rmCaller] = address(0x0); } function buildSuperoir(address ref,uint256 maxLayer) public { if(relations[msg.sender]==address(0x0)) { relations[msg.sender] = ref; superiors[msg.sender].push(ref); address[] memory supers = superiors[ref]; if(supers.length>0){ superiors[msg.sender].push(supers[0]); } uint256 cc = 2; for(uint256 i=1;i<supers.length && cc < maxLayer;i++){ superiors[msg.sender].push(supers[i]); cc++; } } } function withdrawRewards() public{ require(rewards[msg.sender]>0); TransferHelper.safeTransfer(token,msg.sender,rewards[msg.sender]); rewards[msg.sender] = 0; } // 0.03%分配给邀请人(其中0.01%分配给直接推荐人30%,0.005%分配给间接推荐人,15%,0.015%均分给第3代至第12代) function rewards2Super(address user,uint256 totalReward) external returns (bool) { require(callers[msg.sender]==msg.sender,"caller is empty") ; // rewards[user] = rewards[user].add(totalReward); address[] memory supers = superiors[user]; uint256 leftReward = totalReward; uint256 bonus0; uint256 bonus1; uint256 bonus2; if(supers.length>0){ uint256 bonus = totalReward.mul(30).div(100); rewards[supers[0]] = bonus; // TransferHelper.safeTransfer(token,supers[0],bonus); leftReward = leftReward.sub(bonus); bonus0=bonus; } if(supers.length>1){ uint256 bonus = totalReward.mul(15).div(100); rewards[supers[1]] = bonus; // TransferHelper.safeTransfer(token,supers[1],bonus); leftReward = leftReward.sub(bonus); bonus1=bonus; } if(supers.length>2){ uint256 preReward = leftReward.div(supers.length.sub(2)); for(uint256 i=2;i<supers.length ;i++){ // TransferHelper.safeTransfer(token,supers[i],preReward); rewards[supers[i]] = preReward; leftReward = leftReward.sub(preReward); } bonus2=preReward; } if(leftReward>0){ // TransferHelper.safeTransfer(token,topAddr,leftReward); rewards[topAddr] = leftReward; } return true; } } contract TestRefs { Refers public refs; constructor(address _ref) public { refs = Refers(_ref); } function testReward(uint256 amount) public { refs.rewards2Super(msg.sender,amount); } } contract DTrade is ManagerUpgradeable{ using SafeMath for uint256; using SafeERC20 for ERC20; mapping(address => mapping(address =>uint256 )) public uniswapLiquids;//(liquid.addr=>(user.address=>amount) mapping(address => address) public liquidsMap; mapping(address => uint256)public liquidPools; mapping(address => uint256) public profits4DFK1; mapping(address => uint256) public bonusWithdraw; mapping(address => uint256) public checkpointHistory; mapping(address => uint256) public joinTime; address [] public liquidPairs; uint256 public peroid_total_bonus = 90000*(10 **18); uint256 public peroid_left_bonus = 0; uint256 public bonus_per_block = 9*(10 **18); uint256 public bonus_percent_LP = 10; uint256 public checkpoint_number = 0; // uint256 totalProfitDFK1 = 0; uint256 public totalLiquids; uint256 public totalMint; DFKImplHelper public dfk1Helper; uint256 public peroid_mined_coin = 0; address public token1; uint256 public totalFactor = 0; address public liquidToken; DFKII public dfkii; constructor(address _token1,address []memory _mans) public ManagerUpgradeable(_mans){ token1 = _token1; checkpoint_number = block.number+5*60; bytes memory bytecode = type(DTradeLiquids).creationCode; bytes32 salt = keccak256(abi.encodePacked(msg.sender, token1)); address _swapV2; assembly { _swapV2 := create2(0, add(bytecode, 32), mload(bytecode), salt) } liquidToken = _swapV2; } function setDFKII(address _dfkii) public onlyManager { dfkii = DFKII(_dfkii); } function setDfk1Helper(address _dfk1Helper) public onlyManager { dfk1Helper = DFKImplHelper(_dfk1Helper); } function nextPeroid(uint256 total,uint256 perblock,uint256 percentLP) public onlyManager { totalMint = totalMint.add(peroid_total_bonus); peroid_total_bonus = total; bonus_per_block = perblock; bonus_percent_LP = percentLP; peroid_left_bonus = total; peroid_mined_coin = 0; checkpoint_number = block.number; joinTime[address(0x0)] = block.number; } function addUniswapPair(address uniAddr,uint256 factor) public onlyManager { if(liquidsMap[uniAddr]==address(0x0)){ uniswapLiquids[uniAddr][address(0x0)]=factor; totalFactor = totalFactor.add(factor); // uniswapLiquids[address(0x0)][address(0x0)] = uniswapLiquids[address(0x0)][address(0x0)].add(factor); liquidsMap[uniAddr] = uniAddr; liquidPairs.push(uniAddr); } } function removeUniswapPair(address uniAddr) public onlyManager { totalFactor = totalFactor.sub(uniswapLiquids[uniAddr][address(0x0)]); uniswapLiquids[uniAddr][address(0x0)]=0; } function addDfkPair(address uniAddr,uint256 factor) public onlyManager { if(liquidsMap[uniAddr]==address(0x0)){ uniswapLiquids[uniAddr][address(0x0)]=factor; totalFactor = totalFactor.add(factor); liquidsMap[uniAddr] = uniAddr; liquidPairs.push(uniAddr); } } function removeDfkPair(address uniAddr) public onlyManager { totalFactor = totalFactor.sub(uniswapLiquids[uniAddr][address(0x0)]); uniswapLiquids[uniAddr][address(0x0)]=0; } function addLiquid(address uniAddr,uint256 amountUL) public { require(uniswapLiquids[uniAddr][address(0x0)]>0);//factor must large than zero uint256 realBonus=calcBonus(msg.sender); if(realBonus>0) { dfkii._mint(msg.sender,realBonus); } TransferHelper.safeTransferFrom(uniAddr,msg.sender,address(this),amountUL); liquidPools[uniAddr] = liquidPools[uniAddr].add(amountUL); uniswapLiquids[uniAddr][msg.sender]=uniswapLiquids[uniAddr][msg.sender].add(amountUL); uint256 mine_liquid=amountUL.mul(uniswapLiquids[uniAddr][address(0x0)]); // totalLiquids = totalLiquids.add(mine_liquid); DTradeLiquids(liquidToken)._mint(msg.sender,mine_liquid); joinTime[msg.sender] = block.number; bonusWithdraw[msg.sender] = 0; } function removeLiquid(address uniAddr,uint256 amountUL) public { require(uniswapLiquids[uniAddr][msg.sender]>=amountUL,'amountUL is not enough'); uint256 realBonus=calcBonus(msg.sender); if(realBonus>0) { dfkii._mint(msg.sender,realBonus); } TransferHelper.safeTransfer(address(uniAddr),msg.sender,amountUL); uint256 mine_liquid=amountUL.mul(uniswapLiquids[uniAddr][address(0x0)]); DTradeLiquids(liquidToken)._burn(msg.sender,mine_liquid); uniswapLiquids[uniAddr][msg.sender]=uniswapLiquids[uniAddr][msg.sender].sub(amountUL); if(DTradeLiquids(liquidToken).balanceOf(msg.sender)==0){ joinTime[msg.sender] = 0; } else { joinTime[msg.sender] = block.number; } bonusWithdraw[msg.sender] = 0; } function mintCoin(address user) public view returns (uint256){ if(joinTime[user]==0){ return 0; } uint256 checkTime = checkpoint_number; if(joinTime[user]>checkpoint_number){ checkTime = joinTime[user]; } uint256 currentBonus = bonus_per_block.mul(block.number.sub(checkTime)); if(currentBonus>peroid_left_bonus){ currentBonus = peroid_left_bonus; } // return currentBonus; } modifier onlyJoin { require(joinTime[msg.sender] > 0,"onlyJoin time gt 0"); _; } function calcDFK1Bonus(address addr) public view returns(uint256){ if(joinTime[msg.sender] == 0){ return 0; } return dfk1Helper.calcProfitForFee(addr,mintCoin(address(0x0)).mul(bonus_percent_LP).div(100),profits4DFK1[addr]); } function withdrawDFK1Bonus() public onlyJoin returns(uint256){ uint256 bonus=calcDFK1Bonus(msg.sender); if(bonus>0){ profits4DFK1[msg.sender] = profits4DFK1[msg.sender].add(bonus); // totalProfitDFK1 = totalProfitDFK1.sub(bonus); // TransferHelper.safeTransfer(token1,msg.sender,bonus); dfkii._mint(msg.sender,bonus); return bonus; }else{ return 0; } } function withdrawBonus() public onlyJoin returns(uint256){ uint256 realBonus=calcBonus(msg.sender); if(realBonus>0) { bonusWithdraw[msg.sender] = bonusWithdraw[msg.sender].add(realBonus); dfkii._mint(msg.sender,realBonus); joinTime[msg.sender] = block.number; bonusWithdraw[msg.sender] = 0; } return realBonus; } function calcBonus(address addr) public view returns (uint256){ if(joinTime[addr] == 0){ return 0; } if(joinTime[addr]<block.number){ return (ERC20(liquidToken).balanceOf(addr)).div(ERC20(liquidToken).totalSupply()).mul(mintCoin(addr)); }else{ return 0; } } } // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } // function safeTransferETH(address to, uint value) internal { // (bool success,bt) = to.call{value:value}(new bytes(0)); // require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); // } }