This token is claimable
Its 2018 airdrop faucet is still paying out. You can claim free JGE to your own wallet; you only pay gas.
JoygoEOS (JGE) is a 2018 ERC-20 airdrop faucet: anyone could call getTokens() to receive a share of its 1 billion JGE supply.
Token Information
Key Facts
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Byzantium Era
First Metropolis hard fork. Added zk-SNARK precompiles, REVERT opcode, and staticcall.
Bytecode Overview
Verified Source Available
This contract has verified source code on Etherscan.
Show source code (Solidity)
{{
"language": "Solidity",
"sources": {
"JGE.sol": {
"content": "// Submitted by EthereumHistory (ethereumhistory.com)\npragma solidity ^0.4.18;\n\nlibrary SafeMath {\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a / b;\n return c;\n }\n\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n assert(b <= a);\n return a - b;\n }\n\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n assert(c >= a);\n return c;\n }\n}\n\ncontract ForeignToken {\n function balanceOf(address _owner) constant public returns (uint256);\n function transfer(address _to, uint256 _value) public returns (bool);\n}\n\ncontract ContractReceiver {\n function tokenFallback(address _from, uint _value, bytes _data) public returns (bool);\n}\n\ncontract ERC223Basic {\n uint256 public totalSupply;\n function balanceOf(address who) public constant returns (uint256);\n function transfer(address to, uint256 value) public returns (bool);\n function transfer(address to, uint256 value, bytes data) public returns (bool);\n function transfer(address to, uint256 value, bytes data, string custom_fallback) public returns (bool);\n event Transfer(address indexed from, address indexed to, uint256 value);\n}\n\ncontract ERC223 is ERC223Basic {\n function allowance(address owner, address spender) public constant returns (uint256);\n function transferFrom(address from, address to, uint256 value) public returns (bool);\n function approve(address spender, uint256 value) public returns (bool);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n\ninterface Token { \n function distr(address _to, uint256 _value) public returns (bool);\n function totalSupply() constant public returns (uint256 supply);\n function balanceOf(address _owner) constant public returns (uint256 balance);\n}\n\ncontract JGE is ERC223 {\n \n using SafeMath for uint256;\n address public owner;\n\n mapping (address => uint256) balances;\n mapping (address => mapping (address => uint256)) allowed;\n \n mapping (address => bool) public blacklist;\n\n string public name;\n string public symbol;\n uint256 public decimals;\n uint256 public totalSupply;\n \n uint256 public totalDistributed;\n uint256 public totalRemaining;\n uint256 public value;\n uint256 public dividend;\n uint256 public divisor;\n uint256 public invitedReward = 1;\n uint256 public inviteReward = 2;\n\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(address indexed _owner, address indexed _spender, uint256 _value);\n event LOG_Transfer(address indexed from, address indexed to, uint256 value, bytes indexed data);\n \n event Distr(address indexed to, uint256 amount);\n event InviteInit(address indexed to, uint256 amount);\n\n event DistrFinished();\n event DistrStarted();\n \n event Burn(address indexed burner, uint256 value);\n event Mint(address indexed minter, uint256 value);\n \n bool public distributionFinished = false;\n bool public inviteFinished = false;\n\n modifier canDistr() {\n require(!distributionFinished);\n _;\n }\n \n modifier canNotDistr() {\n require(distributionFinished);\n _;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n \n modifier onlyWhitelist() {\n require(blacklist[msg.sender] == false);\n _;\n }\n \n function JGE (string _tokenName, string _tokenSymbol, uint256 _decimalUnits, uint256 _initialAmount, uint256 _totalDistributed, uint256 _value, uint256 _dividend, uint256 _divisor) public {\n require(_decimalUnits != 0);\n require(_initialAmount != 0);\n require(_totalDistributed != 0);\n require(_value != 0);\n require(_dividend != 0);\n require(_divisor != 0);\n \n \n owner = msg.sender;\n name = _tokenName;\n symbol = _tokenSymbol;\n decimals = _decimalUnits;\n totalSupply = _initialAmount;\n totalDistributed = _totalDistributed;\n totalRemaining = totalSupply.sub(totalDistributed);\n value = _value;\n dividend = _dividend;\n divisor = _divisor;\n \n balances[owner] = totalDistributed;\n Transfer(address(0), owner, totalDistributed);\n }\n \n function transferOwnership(address newOwner) onlyOwner public {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n \n function enableWhitelist(address[] addresses) onlyOwner public {\n for (uint i = 0; i < addresses.length; i++) {\n blacklist[addresses[i]] = false;\n }\n }\n\n function disableWhitelist(address[] addresses) onlyOwner public {\n for (uint i = 0; i < addresses.length; i++) {\n blacklist[addresses[i]] = true;\n }\n }\n \n function finishDistribution() onlyOwner canDistr public returns (bool) {\n distributionFinished = true;\n DistrFinished();\n return true;\n }\n \n function startDistribution() onlyOwner canNotDistr public returns (bool) {\n distributionFinished = false;\n DistrStarted();\n return true;\n }\n \n function finishInvite() onlyOwner public returns (bool) {\n require(!inviteFinished);\n inviteFinished = true;\n return true;\n }\n \n function startInvite() onlyOwner public returns (bool) {\n require(inviteFinished);\n inviteFinished = false;\n return true;\n }\n \n function changeTotalDistributed(uint256 newTotalDistributed) onlyOwner public {\n totalDistributed = newTotalDistributed;\n }\n \n function changeTotalRemaining(uint256 newTotalRemaining) onlyOwner public {\n totalRemaining = newTotalRemaining;\n }\n \n function changeValue(uint256 newValue) onlyOwner public {\n value = newValue;\n }\n \n function changeTotalSupply(uint256 newTotalSupply) onlyOwner public {\n totalSupply = newTotalSupply;\n }\n \n function changeDecimals(uint256 newDecimals) onlyOwner public {\n decimals = newDecimals;\n }\n \n function changeName(string newName) onlyOwner public {\n name = newName;\n }\n \n function changeSymbol(string newSymbol) onlyOwner public {\n symbol = newSymbol;\n }\n \n function changeDivisor(uint256 newDivisor) onlyOwner public {\n divisor = newDivisor;\n }\n \n function changeDividend(uint256 newDividend) onlyOwner public {\n dividend = newDividend;\n }\n \n function changeInviteReward(uint256 newInviteReward) onlyOwner public {\n inviteReward = newInviteReward;\n }\n \n function changeInvitedReward(uint256 newInvitedReward) onlyOwner public {\n invitedReward = newInvitedReward;\n }\n \n function distr(address _to, uint256 _amount) canDistr private returns (bool) {\n totalDistributed = totalDistributed.add(_amount);\n totalRemaining = totalRemaining.sub(_amount);\n balances[_to] = balances[_to].add(_amount);\n Distr(_to, _amount);\n Transfer(address(0), _to, _amount);\n return true;\n \n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n }\n \n function airdrop(address[] addresses) onlyOwner canDistr public {\n \n require(addresses.length <= 255);\n require(value <= totalRemaining);\n \n for (uint i = 0; i < addresses.length; i++) {\n require(value <= totalRemaining);\n distr(addresses[i], value);\n }\n\t\n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n }\n \n function distribution(address[] addresses, uint256 amount) onlyOwner canDistr public {\n \n require(addresses.length <= 255);\n require(amount <= totalRemaining);\n \n for (uint i = 0; i < addresses.length; i++) {\n require(amount <= totalRemaining);\n distr(addresses[i], amount);\n }\n\t\n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n }\n \n function distributeAmounts(address[] addresses, uint256[] amounts) onlyOwner canDistr public {\n\n require(addresses.length <= 255);\n require(addresses.length == amounts.length);\n \n for (uint8 i = 0; i < addresses.length; i++) {\n require(amounts[i] <= totalRemaining);\n distr(addresses[i], amounts[i]);\n \n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n }\n }\n \n function () external payable {\n getTokens();\n }\n \n function getTokens() payable canDistr onlyWhitelist public {\n \n if (value > totalRemaining) {\n value = totalRemaining;\n }\n \n require(value <= totalRemaining);\n \n address investor = msg.sender;\n uint256 toGive = value;\n \n distr(investor, toGive);\n \n if (toGive > 0) {\n blacklist[investor] = true;\n }\n\n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n \n value = value.div(dividend).mul(divisor);\n }\n\n function balanceOf(address _owner) constant public returns (uint256) {\n\t return getBalance(_owner);\n }\n \n function getBalance(address _address) constant internal returns (uint256) {\n if (_address !=address(0) && !distributionFinished && !blacklist[_address] && totalDistributed < totalSupply && !inviteFinished) {\n return balances[_address].add(value);\n }\n else {\n return balances[_address];\n }\n }\n\n // mitigates the ERC20 short address attack\n modifier onlyPayloadSize(uint size) {\n assert(msg.data.length >= size + 4);\n _;\n }\n \n function transfer(address _to, uint256 _amount, bytes _data, string _custom_fallback) onlyPayloadSize(2 * 32) public returns (bool success) {\n if(isContract(_to)) {\n require(balanceOf(msg.sender) >= _amount);\n balances[msg.sender] = balanceOf(msg.sender).sub(_amount);\n balances[_to] = balanceOf(_to).add(_amount);\n ContractReceiver receiver = ContractReceiver(_to);\n require(receiver.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _amount, _data));\n \n Transfer(msg.sender, _to, _amount);\n LOG_Transfer(msg.sender, _to, _amount, _data);\n return true;\n }\n else {\n return transferToAddress(_to, _amount, _data);\n }\n }\n\n\n function transfer(address _to, uint256 _amount, bytes _data) onlyPayloadSize(2 * 32) public returns (bool success) {\n\n require(_to != address(0));\n\n if(isContract(_to)) {\n return transferToContract(_to, _amount, _data);\n }\n else {\n return transferToAddress(_to, _amount, _data);\n }\n }\n\n function transfer(address _to, uint256 _amount) onlyPayloadSize(2 * 32) public returns (bool success) {\n \n require(_to != address(0));\n \n bytes memory empty;\n \n if(isContract(_to)) {\n return transferToContract(_to, _amount, empty);\n }\n else {\n require(invite(msg.sender, _to));\n return transferToAddress(_to, _amount, empty);\n }\n }\n \n function transferFrom(address _from, address _to, uint256 _amount) onlyPayloadSize(3 * 32) public returns (bool success) {\n\n require(_to != address(0));\n require(_amount <= balances[_from]);\n require(_amount <= allowed[_from][msg.sender]);\n \n require(invite(_from, _to));\n \n bytes memory empty;\n \n balances[_from] = balances[_from].sub(_amount);\n allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);\n balances[_to] = balances[_to].add(_amount);\n Transfer(_from, _to, _amount);\n LOG_Transfer(_from, _to, _amount, empty);\n return true;\n }\n \n function invite(address _from, address _to) internal returns (bool success) {\n \n if(inviteFinished){\n return true; \n }\n\n if(invitedInit(_from) && _from != _to){\n inviteInit(_to);\n return true;\n }\n invitedInit(_to);\n return true;\n }\n \n function inviteInit(address _address) internal returns (bool success) {\n if (!distributionFinished && totalDistributed < totalSupply) {\n \n \n if (value.mul(inviteReward) > totalRemaining) {\n value = totalRemaining;\n }\n require(value.mul(inviteReward) <= totalRemaining);\n \n uint256 toGive = value.mul(inviteReward);\n \n totalDistributed = totalDistributed.add(toGive);\n totalRemaining = totalRemaining.sub(toGive);\n balances[_address] = balances[_address].add(toGive);\n InviteInit(_address, toGive);\n Transfer(address(0), _address, toGive);\n\n if (toGive > 0) {\n blacklist[_address] = true;\n }\n\n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n \n value = value.div(dividend).mul(divisor);\n return true;\n }\n return false;\n }\n \n function invitedInit(address _address) internal returns (bool success) {\n if (!distributionFinished && totalDistributed < totalSupply && !blacklist[_address]) {\n \n if (value.mul(invitedReward) > totalRemaining) {\n value = totalRemaining;\n }\n require(value.mul(invitedReward) <= totalRemaining);\n \n uint256 toGive = value.mul(invitedReward);\n \n totalDistributed = totalDistributed.add(toGive);\n totalRemaining = totalRemaining.sub(toGive);\n balances[_address] = balances[_address].add(toGive);\n InviteInit(_address, toGive);\n Transfer(address(0), _address, toGive);\n\n if (toGive > 0) {\n blacklist[_address] = true;\n }\n\n if (totalDistributed >= totalSupply) {\n distributionFinished = true;\n }\n \n value = value.div(dividend).mul(divisor);\n return true;\n }\n return false;\n }\n \n function approve(address _spender, uint256 _value) public returns (bool success) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n return true;\n }\n \n function allowance(address _owner, address _spender) constant public returns (uint256) {\n return allowed[_owner][_spender];\n }\n \n function getTokenBalance(address tokenAddress, address who) constant public returns (uint){\n ForeignToken t = ForeignToken(tokenAddress);\n uint bal = t.balanceOf(who);\n return bal;\n }\n \n function withdraw() onlyOwner public {\n uint256 etherBalance = this.balance;\n owner.transfer(etherBalance);\n }\n \n function mint(uint256 _value) onlyOwner public {\n\n address minter = msg.sender;\n balances[minter] = balances[minter].add(_value);\n totalSupply = totalSupply.add(_value);\n Mint(minter, _value);\n }\n \n function burn(uint256 _value) onlyOwner public {\n require(_value <= balances[msg.sender]);\n\n address burner = msg.sender;\n balances[burner] = balances[burner].sub(_value);\n totalSupply = totalSupply.sub(_value);\n Burn(burner, _value);\n }\n \n function withdrawForeignTokens(address _tokenContract) onlyOwner public returns (bool) {\n ForeignToken token = ForeignToken(_tokenContract);\n uint256 amount = token.balanceOf(address(this));\n return token.transfer(owner, amount);\n }\n \n function approveAndCall(address _spender, uint256 _value, bytes _extraData) payable public returns (bool) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n \n require(_spender.call(bytes4(bytes32(keccak256(\"receiveApproval(address,uint256,address,bytes)\"))), msg.sender, _value, this, _extraData));\n return true;\n }\n \n function isContract(address _addr) private constant returns (bool) {\n uint length;\n assembly {\n length := extcodesize(_addr)\n }\n return (length>0);\n }\n\n function transferToAddress(address _to, uint _value, bytes _data) private returns (bool) {\n require(balanceOf(msg.sender) >= _value);\n balances[msg.sender] = balanceOf(msg.sender).sub(_value);\n balances[_to] = balanceOf(_to).add(_value);\n Transfer(msg.sender, _to, _value);\n LOG_Transfer(msg.sender, _to, _value, _data);\n return true;\n }\n\n function transferToContract(address _to, uint _value, bytes _data) private returns (bool) {\n require(balanceOf(msg.sender) >= _value);\n balances[msg.sender] = balanceOf(msg.sender).sub(_value);\n balances[_to] = balanceOf(_to).add(_value);\n ContractReceiver receiver = ContractReceiver(_to);\n receiver.tokenFallback(msg.sender, _value, _data);\n Transfer(msg.sender, _to, _value);\n LOG_Transfer(msg.sender, _to, _value, _data);\n return true;\n }\n\n}"
}
},
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}External Links
Related contracts
Msg
Same eraMinimal contract that stores a single public string in state, exposed via the auto-generated m() getter. First of 281 identical siblings. Source verified by EthereumHistory.
0x2c8f58...37b173January 13, 2018Wallet
Same eraToken collection wallet that moves an entire token balance to a chosen address, without the ERC223 callback handler.
0x002204...531195January 19, 2018Wallet
Same eraOwner wallet that forwards ether to its owner, logs any call from a stranger with the full calldata, and lets the owner execute arbitrary calls.
0x001feb...9e7a4fJanuary 20, 2018Forwarder
Same eraNinety-three bytes with one hardcoded destination: every payment received is transferred straight back out to the same address.
0x458353...a562deJanuary 20, 2018Sweeper
Same eraMinimal ETH sweeper, first of 1,900 identical deployments in a 2-day burst in January 2018. All sweep to a single hardcoded destination. Source verified by EthereumHistory.
0xeb15f6...6cb3e1January 23, 2018Sweep
Same eraETH sweep-to-fixed-recipient — fallback forwards the contract's entire balance to `0xd293a88c…8d4` via `.send()` and reverts on failure. Massive cluster of 1899 identical deployments — likely deposit-address contracts for a single custodian.
0x00188b...b260a7January 23, 2018