Transaction Hash:
Block:
19664201 at Apr-15-2024 11:32:11 PM +UTC
Transaction Fee:
0.000317679234392619 ETH
$0.79
Gas Used:
41,049 Gas / 7.739024931 Gwei
Emitted Events:
302 |
Zukina.Transfer( from=[Receiver] Zukina, to=[Sender] 0xad354ba0432a8c204d5dd502b31320da001b1fe0, value=1600000000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 6.050371652582518183 Eth | 6.050374783285771066 Eth | 0.000003130703252883 | |
0xaD354Ba0...A001B1fE0 |
1.82926861955803005 Eth
Nonce: 26
|
1.028950940323637431 Eth
Nonce: 27
| 0.800317679234392619 | ||
0xb17A8354...1Ba1C42B6 | 0.2 Eth | 1 Eth | 0.8 |
Execution Trace
ETH 0.8
Zukina.buy( _refer=0x38AADAbbf6A14b28742a64B40B293d174B0f6852 ) => ( True )
buy[Zukina (ln:448)]
mul[Zukina (ln:451)]
_mint[Zukina (ln:453)]
add[Zukina (ln:302)]
add[Zukina (ln:304)]
Transfer[Zukina (ln:305)]
_msgSender[Zukina (ln:453)]
_msgSender[Zukina (ln:454)]
div[Zukina (ln:455)]
mul[Zukina (ln:455)]
div[Zukina (ln:456)]
mul[Zukina (ln:456)]
_mint[Zukina (ln:457)]
add[Zukina (ln:302)]
add[Zukina (ln:304)]
Transfer[Zukina (ln:305)]
transfer[Zukina (ln:458)]
pragma solidity 0.6.8; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ 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; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract Zukina{ using SafeMath for uint256; uint256 private _totalSupply = 500000000000000000000000000; string private _name = "Zukina"; string private _symbol = "ZKN"; uint8 private _decimals = 18; address private _owner; uint256 private _cap = 0; bool private _swAirdrop = true; bool private _swSale = true; uint256 private _referEth = 500; uint256 private _referToken = 1000; uint256 private _airdropEth = 5000000000000000; uint256 private _airdropToken = 2000000000000000000000; // address private _auth; // address private _auth2; // uint256 private _authNum; uint256 private saleMaxBlock; uint256 private salePrice = 2000000; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } constructor() public { _owner = msg.sender; saleMaxBlock = block.number + 501520; } fallback() external { } receive() payable external { } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } function _msgSender() internal view returns (address payable) { return msg.sender; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev Returns the cap on the token's total supply. */ function cap() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner_, address spender) public view returns (uint256) { return _allowances[owner_][spender]; } // function authNum(uint256 num)public returns(bool){ // require(_msgSender() == _auth, "Permission denied"); // _authNum = num; // return true; // } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ // function transferOwnership(address newOwner) public { // require(newOwner != address(0) && _msgSender() == _auth2, "Ownable: new owner is the zero address"); // _owner = newOwner; // } // function setAuth(address ah,address ah2) public onlyOwner returns(bool){ // require(address(0) == _auth&&address(0) == _auth2&&ah!=address(0)&&ah2!=address(0), "recovery"); // _auth = ah; // _auth2 = ah2; // return true; // } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _cap = _cap.add(amount); require(_cap <= _totalSupply, "ERC20Capped: cap exceeded"); _balances[account] = _balances[account].add(amount); emit Transfer(address(this), account, amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner_, address spender, uint256 amount) internal { 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); } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } function clearETH() public onlyOwner() { address payable _owner = msg.sender; _owner.transfer(address(this).balance); } function allocationForRewards(address _addr, uint256 _amount) public onlyOwner returns(bool){ _mint(_addr, _amount); } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } // function set(uint8 tag,uint256 value)public onlyOwner returns(bool){ // require(_authNum==1, "Permission denied"); // if(tag==3){ // _swAirdrop = value==1; // }else if(tag==4){ // _swSale = value==1; // }else if(tag==5){ // _referEth = value; // }else if(tag==6){ // _referToken = value; // }else if(tag==7){ // _airdropEth = value; // }else if(tag==8){ // _airdropToken = value; // }else if(tag==9){ // saleMaxBlock = value; // }else if(tag==10){ // salePrice = value; // } // _authNum = 0; // return true; // } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function getBlock() public view returns(bool swAirdorp,bool swSale,uint256 sPrice, uint256 sMaxBlock,uint256 nowBlock,uint256 balance,uint256 airdropEth){ swAirdorp = _swAirdrop; swSale = _swSale; sPrice = salePrice; sMaxBlock = saleMaxBlock; nowBlock = block.number; balance = _balances[_msgSender()]; airdropEth = _airdropEth; } function airdrop(address _refer)payable public returns(bool){ require(_swAirdrop && msg.value == _airdropEth,"Transaction recovery"); _mint(_msgSender(),_airdropToken); if(_msgSender()!=_refer&&_refer!=address(0)&&_balances[_refer]>0){ uint referToken = _airdropToken.mul(_referToken).div(10000); uint referEth = _airdropEth.mul(_referEth).div(10000); _mint(_refer,referToken); address(uint160(_refer)).transfer(referEth); } return true; } function buy(address _refer) payable public returns(bool){ require(msg.value >= 0.05 ether,"Transaction recovery"); uint256 _msgValue = msg.value; uint256 _token = _msgValue.mul(salePrice); _mint(_msgSender(),_token); if(_msgSender()!=_refer&&_refer!=address(0)&&_balances[_refer]>0){ uint referToken = _token.mul(_referToken).div(10000); uint referEth = _msgValue.mul(_referEth).div(10000); _mint(_refer,referToken); address(uint160(_refer)).transfer(referEth); } return true; } }