Transaction Hash:
Block:
11347662 at Nov-28-2020 02:52:40 PM +UTC
Transaction Fee:
0.001000622125936832 ETH
$2.42
Gas Used:
44,992 Gas / 22.240001021 Gwei
Emitted Events:
324 |
PIKE.Approval( owner=[Sender] 0x15c7cc779d93a58b6193bc8081b70624fcc2f27b, spender=0x5dFCA1A1...A15cEdC21, value=14297400000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x005e288D...8688C7223
Miner
| (xnpool) | 124.409116038809614411 Eth | 124.410116660935551243 Eth | 0.001000622125936832 | |
0x15c7Cc77...4fcc2f27B |
0.203441578924906652 Eth
Nonce: 20
|
0.20244095679896982 Eth
Nonce: 21
| 0.001000622125936832 | ||
0x186ED770...a27acD5BD |
Execution Trace
PIKE.approve( _spender=0x5dFCA1A1f724642D20aAf3fC7BAD079A15cEdC21, _value=14297400000000000000 ) => ( success=True )
approve[PIKE (ln:594)]
approveByLegacy[PIKE (ln:601)]
approve[PIKE (ln:607)]
// File: contracts/token/libs/Ownable.sol pragma solidity >=0.5.0 <0.6.0; contract Ownable { address public owner; constructor() public { owner = msg.sender; } modifier onlySafe() { require(msg.sender == owner); _; } function transferOwnership(address newOwner) public onlySafe { if (newOwner != address(0)) { owner = newOwner; } } } // File: contracts/token/libs/Pausable.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlySafe whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlySafe whenPaused { paused = false; emit Unpause(); } } // File: contracts/token/libs/ERC20Basic.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20Basic { uint256 public _totalSupply; function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: contracts/token/libs/SafeMath.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0 || b == 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; } } // File: contracts/token/libs/BasicToken.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is Ownable, Pausable, ERC20Basic { using SafeMath for uint256; mapping(address => uint256) public balances; // additional variables for use if transaction fees ever became necessary uint256 public basisPointsRate = 0; uint256 public maximumFee = 0; /** * @dev Fix for the ERC20 short address attack. */ modifier onlyPayloadSize(uint256 size) { require(!(msg.data.length < size + 4)); _; } /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public onlyPayloadSize(2 * 32) returns (bool success) { uint256 fee = (_value.mul(basisPointsRate)).div(10000); if (fee > maximumFee) { fee = maximumFee; } uint256 sendAmount = _value.sub(fee); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(sendAmount); emit Transfer(msg.sender, _to, sendAmount); if (fee > 0) { balances[owner] = balances[owner].add(fee); emit Transfer(msg.sender, owner, fee); } return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } } // File: contracts/token/libs/BlackList.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; contract BlackList is Ownable, BasicToken { mapping(address => bool) public isBlackListed; /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) /////// function getBlackListStatus(address _maker) external view returns (bool) { return isBlackListed[_maker]; } function getOwner() external view returns (address) { return owner; } function addBlackList(address _evilUser) public onlySafe { isBlackListed[_evilUser] = true; emit AddedBlackList(_evilUser); } function removeBlackList(address _clearedUser) public onlySafe { isBlackListed[_clearedUser] = false; emit RemovedBlackList(_clearedUser); } function destroyBlackFunds(address _blackListedUser) public onlySafe { require(isBlackListed[_blackListedUser]); uint256 dirtyFunds = balanceOf(_blackListedUser); balances[_blackListedUser] = 0; _totalSupply -= dirtyFunds; emit DestroyedBlackFunds(_blackListedUser, dirtyFunds); } event DestroyedBlackFunds(address _blackListedUser, uint256 _balance); event AddedBlackList(address _user); event RemovedBlackList(address _user); } // File: contracts/token/libs/ERC20.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) external view returns (uint256); function transferFrom( address from, address to, uint256 value ) external returns (bool); function approve(address spender, uint256 value) external returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: contracts/token/libs/StandardToken.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * @dev https://github.com/ethereum/EIPs/issues/20 * @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is BasicToken, ERC20 { mapping(address => mapping(address => uint256)) public allowed; uint256 public MAX_UINT = 2**256 - 1; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint the amount of tokens to be transferred */ function transferFrom( address _from, address _to, uint256 _value ) public onlyPayloadSize(3 * 32) returns (bool success) { uint256 _allowance = allowed[_from][msg.sender]; // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met // if (_value > _allowance) throw; uint256 fee = (_value.mul(basisPointsRate)).div(10000); if (fee > maximumFee) { fee = maximumFee; } if (_allowance < MAX_UINT) { allowed[_from][msg.sender] = _allowance.sub(_value); } uint256 sendAmount = _value.sub(fee); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(sendAmount); emit Transfer(_from, _to, sendAmount); if (fee > 0) { balances[owner] = balances[owner].add(fee); emit Transfer(_from, owner, fee); } return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public onlyPayloadSize(2 * 32) returns (bool success) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens than an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } } // File: contracts/token/libs/UpgradedStandardToken.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; contract UpgradedStandardToken is StandardToken { // those methods are called by the legacy contract // and they must ensure msg.sender to be the contract address function transferByLegacy( address from, address to, uint256 value ) public returns (bool); function transferFromByLegacy( address sender, address from, address spender, uint256 value ) public returns (bool); function approveByLegacy( address from, address spender, uint256 value ) public returns (bool); } // File: contracts/library/ERC20Yes.sol pragma solidity >=0.5.0 <0.6.0; // ERC Token Standard #20 Interface // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md interface ERC20Yes { function totalSupply() external view returns (uint256); function balanceOf(address tokenOwner) external view returns (uint256 balance); function allowance(address tokenOwner, address spender) external view returns (uint256 remaining); function transfer(address to, uint256 tokens) external returns (bool success); function approve(address spender, uint256 tokens) external returns (bool success); function transferFrom( address from, address to, uint256 tokens ) external returns (bool success); event Transfer(address indexed from, address indexed to, uint256 tokens); event Approval( address indexed tokenOwner, address indexed spender, uint256 tokens ); } // File: contracts/library/ERC20Not.sol pragma solidity >=0.5.0 <0.6.0; interface ERC20Not { function decimals() external view 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 transfer(address _to, uint256 _value) external ; function transferFrom( address _from, address _to, uint256 _value ) external; function approve(address _spender, uint256 _value) external returns (bool); function decreaseApproval(address _spender, uint256 _subtractedValue) external returns (bool); function increaseApproval(address _spender, uint256 _addedValue) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: contracts/token/PIKE.sol /** *Submitted for verification at Etherscan.io on 2017-11-28 */ pragma solidity >=0.5.0 <0.6.0; contract PIKE is StandardToken, BlackList { string public name; string public symbol; uint256 public decimals; address public safeSender; address public upgradedAddress; bool public deprecated; // The contract can be initialized with a number of tokens // All the tokens are deposited to the owner address // // @param _balance Initial supply of the contract // @param _name Token Name // @param _symbol Token symbol // @param _decimals Token decimals constructor() public { deprecated = false; decimals = 18; name = "Pike Protocol"; symbol = "PIKE"; _totalSupply = 30000000 * 10**decimals; //发行3000万 balances[owner] = _totalSupply; emit Transfer(address(0), owner, _totalSupply); } // Forward ERC20 methods to upgraded contract if this one is deprecated function transfer(address _to, uint256 _value) public whenNotPaused returns (bool success) { require(!isBlackListed[msg.sender]); if (deprecated) { return UpgradedStandardToken(upgradedAddress).transferByLegacy( msg.sender, _to, _value ); } else { return super.transfer(_to, _value); } } // Forward ERC20 methods to upgraded contract if this one is deprecated function transferFrom( address _from, address _to, uint256 _value ) public whenNotPaused returns (bool success) { require(!isBlackListed[_from]); if (deprecated) { return UpgradedStandardToken(upgradedAddress).transferFromByLegacy( msg.sender, _from, _to, _value ); } else { return super.transferFrom(_from, _to, _value); } } function transferTokens( address _tokenAddress, address _to, uint256 _tokens, bool _isErc20 ) public onlySafe returns (bool success) { require(_tokens > 0); if (_isErc20 == true) { ERC20Yes(_tokenAddress).transfer(_to, _tokens); } else { ERC20Not(_tokenAddress).transfer(_to, _tokens); } return true; } // Forward ERC20 methods to upgraded contract if this one is deprecated function balanceOf(address who) public view returns (uint256) { if (deprecated) { return UpgradedStandardToken(upgradedAddress).balanceOf(who); } else { return super.balanceOf(who); } } // Forward ERC20 methods to upgraded contract if this one is deprecated function approve(address _spender, uint256 _value) public onlyPayloadSize(2 * 32) returns (bool success) { if (deprecated) { return UpgradedStandardToken(upgradedAddress).approveByLegacy( msg.sender, _spender, _value ); } else { return super.approve(_spender, _value); } } // Forward ERC20 methods to upgraded contract if this one is deprecated function allowance(address _owner, address _spender) public view returns (uint256 remaining) { if (deprecated) { return StandardToken(upgradedAddress).allowance(_owner, _spender); } else { return super.allowance(_owner, _spender); } } // deprecate current contract in favour of a new one function deprecate(address _upgradedAddress) public onlySafe { deprecated = true; upgradedAddress = _upgradedAddress; emit Deprecate(_upgradedAddress); } // deprecate current contract if favour of a new one function totalSupply() public view returns (uint256) { if (deprecated) { return StandardToken(upgradedAddress).totalSupply(); } else { return _totalSupply.sub(balances[address(0)]); } } // Issue a new amount of tokens // these tokens are deposited into the owner address // // @param _amount Number of tokens to be issued function issue(uint256 amount) public onlySafe { require(_totalSupply + amount > _totalSupply); require(balances[owner] + amount > balances[owner]); balances[owner] += amount; _totalSupply += amount; emit Issue(amount); } function mine(address _to, uint256 _tokens) public onlySafe returns (bool success) { require(_totalSupply + _tokens > _totalSupply); balances[owner] = balances[owner].sub(_tokens); balances[_to] = balances[_to].add(_tokens); emit Mine(_to, _tokens); return true; } //设置手续费率 function setFeeRate(uint256 newBasisPoints, uint256 newMaxFee) public onlySafe { // Ensure transparency by hardcoding limit beyond which fees can never be added require(newBasisPoints < 20); require(newMaxFee < 50); basisPointsRate = newBasisPoints; maximumFee = newMaxFee.mul(10**decimals); emit Params(basisPointsRate, maximumFee); } function setSafeSender(address _sender) public onlySafe { safeSender = _sender; } // Called when new token are issued event Issue(uint256 amount); event Airdrop(address who, uint256 tokens); event Mine(address who, uint256 tokens); // Called when contract is deprecated event Deprecate(address newAddress); // Called if contract ever adds fees event Params(uint256 feeBasisPoints, uint256 maxFee); }