Last active
August 24, 2022 04:17
-
-
Save ruvnet/6de5834e2f67600ee110d29893b0541a to your computer and use it in GitHub Desktop.
CoinLaunch Token Contract
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^ 0.4.17; | |
/** | |
* @title CoinLaunch Token Only Contract | |
* @dev Copyright CoinLaunch Corp | |
* @note use for verification purposes more details at coinlaunch.market | |
*/ | |
library SafeMath { | |
function mul(uint a, uint b) internal pure returns(uint) { | |
uint c = a * b; | |
assert(a == 0 || c / a == b); | |
return c; | |
} | |
function sub(uint a, uint b) internal pure returns(uint) { | |
assert(b <= a); | |
return a - b; | |
} | |
function add(uint a, uint b) internal pure returns(uint) { | |
uint c = a + b; | |
assert(c >= a && c >= b); | |
return c; | |
} | |
} | |
contract ERC20 { | |
uint public totalSupply; | |
function balanceOf(address who) public view returns(uint); | |
function allowance(address owner, address spender) public view returns(uint); | |
function transfer(address to, uint value) public returns(bool ok); | |
function transferFrom(address from, address to, uint value) public returns(bool ok); | |
function approve(address spender, uint value) public returns(bool ok); | |
event Transfer(address indexed from, address indexed to, uint value); | |
event Approval(address indexed owner, address indexed spender, uint value); | |
} | |
/** | |
* @title Ownable | |
* @dev The Ownable contract has an owner address, and provides basic authorization control | |
* functions, this simplifies the implementation of "user permissions". | |
*/ | |
contract Ownable { | |
address public owner; | |
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); | |
/** | |
* @dev The Ownable constructor sets the original `owner` of the contract to the sender | |
* account. | |
*/ | |
function Ownable() public { | |
owner = msg.sender; | |
} | |
/** | |
* @dev Throws if called by any account other than the owner. | |
*/ | |
modifier onlyOwner() { | |
require(msg.sender == owner); | |
_; | |
} | |
/** | |
* @dev Allows the current owner to transfer control of the contract to a newOwner. | |
* @param newOwner The address to transfer ownership to. | |
*/ | |
function transferOwnership(address newOwner) public onlyOwner { | |
require(newOwner != address(0)); | |
OwnershipTransferred(owner, newOwner); | |
owner = newOwner; | |
} | |
} | |
// Crowdsale Smart Contract | |
// This smart contract collects ETH and in return sends tokens to the Backers | |
contract DeployTokenContract is Ownable { | |
address public commissionAddress; // address to deposit commissions | |
uint public deploymentCost; | |
event TokenDeployed(address newToken, uint amountPaid); | |
function DeployTokenContract(uint _deploymentCost, address _commissionAddress) public { | |
require(_deploymentCost > 0); | |
require(_commissionAddress != address(0)); | |
deploymentCost = _deploymentCost; | |
commissionAddress = _commissionAddress; | |
} | |
function updateDeployomentCost(uint _newDeploymentCost) external onlyOwner() { | |
require(_newDeploymentCost > 0); | |
deploymentCost = _newDeploymentCost; | |
} | |
function deployToken(uint _initialSupply, | |
string _tokenName, | |
uint _decimalUnits, | |
string _tokenSymbol, | |
string _version | |
) public payable returns (address) { | |
require(msg.value == deploymentCost); | |
Token token = new Token(_initialSupply, _tokenName, _decimalUnits, _tokenSymbol, _version, msg.sender); | |
commissionAddress.transfer(msg.value); | |
TokenDeployed(token, msg.value); | |
return token; | |
} | |
} | |
// The token | |
contract Token is ERC20, Ownable { | |
using SafeMath for uint; | |
// Public variables of the token | |
string public name; | |
string public symbol; | |
uint public decimals; // How many decimals to show. | |
string public version; | |
uint public totalSupply; | |
mapping(address => uint) public balances; | |
mapping(address => mapping(address => uint)) public allowed; | |
modifier onlyAuthorized() { | |
if (msg.sender != owner) | |
revert(); | |
_; | |
} | |
// The Token constructor | |
function Token(uint _initialSupply, | |
string _tokenName, | |
uint _decimalUnits, | |
string _tokenSymbol, | |
string _version, | |
address _owner | |
) public { | |
totalSupply = _initialSupply * (10**_decimalUnits); | |
name = _tokenName; // Set the name for display purposes | |
symbol = _tokenSymbol; // Set the symbol for display purposes | |
decimals = _decimalUnits; // Amount of decimals for display purposes | |
version = _version; | |
transferOwnership(_owner); // change owner from contract adress to the person deploying | |
balances[owner] = totalSupply; | |
} | |
function burn(address _member, uint256 _value) public onlyAuthorized returns(bool) { | |
require(balances[_member] >= _value); | |
balances[_member] -= _value; | |
totalSupply -= _value; | |
Transfer(_member, 0x0, _value); | |
return true; | |
} | |
// @notice transfer tokens to given address | |
// @param _to {address} address or recipient | |
// @param _value {uint} amount to transfer | |
// @return {bool} true if successful | |
function transfer(address _to, uint _value) public returns(bool) { | |
require(_to != address(0)); | |
require(balances[msg.sender] >= _value); | |
balances[msg.sender] -= _value; | |
balances[_to] += _value; | |
Transfer(msg.sender, _to, _value); | |
return true; | |
} | |
// @notice transfer tokens from given address to another address | |
// @param _from {address} from whom tokens are transferred | |
// @param _to {address} to whom tokens are transferred | |
// @param _value {uint} amount of tokens to transfer | |
// @return {bool} true if successful | |
function transferFrom(address _from, address _to, uint256 _value) public returns(bool success) { | |
require(_to != address(0)); | |
require(balances[_from] >= _value); // Check if the sender has enough | |
require(_value <= allowed[_from][msg.sender]); // Check if allowed is greater or equal | |
balances[_from] -= _value; // Subtract from the sender | |
balances[_to] += _value; // Add the same to the recipient | |
allowed[_from][msg.sender] -= _value; // adjust allowed | |
Transfer(_from, _to, _value); | |
return true; | |
} | |
// @notice to query balance of account | |
// @return _owner {address} address of user to query balance | |
function balanceOf(address _owner) public view returns(uint balance) { | |
return balances[_owner]; | |
} | |
/** | |
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. | |
* | |
* Beware that changing an allowance with this method brings the risk that someone may use both the old | |
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this | |
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: | |
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 | |
* @param _spender The address which will spend the funds. | |
* @param _value The amount of tokens to be spent. | |
*/ | |
function approve(address _spender, uint _value) public returns(bool) { | |
allowed[msg.sender][_spender] = _value; | |
Approval(msg.sender, _spender, _value); | |
return true; | |
} | |
// @notice to query of allowance of one user to the other | |
// @param _owner {address} of the owner of the account | |
// @param _spender {address} of the spender of the account | |
// @return remaining {uint} amount of remaining allowance | |
function allowance(address _owner, address _spender) public view returns(uint remaining) { | |
return allowed[_owner][_spender]; | |
} | |
/** | |
* approve should be called when allowed[_spender] == 0. To increment | |
* allowed value is better to use this function to avoid 2 calls (and wait until | |
* the first transaction is mined) | |
* From MonolithDAO Token.sol | |
*/ | |
function increaseApproval (address _spender, uint _addedValue) public returns (bool success) { | |
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); | |
Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
function decreaseApproval (address _spender, uint _subtractedValue) public returns (bool success) { | |
uint oldValue = allowed[msg.sender][_spender]; | |
if (_subtractedValue > oldValue) { | |
allowed[msg.sender][_spender] = 0; | |
} else { | |
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); | |
} | |
Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment