ERC20Factory

Description:

ERC20 token contract with Factory capabilities. Standard implementation for fungible tokens on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "LaunchStream/contracts/contracts/ERC20Factory.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "./ERC20Token.sol";

/**
 * @title LaunchStream ERC20 Token Factory
 * @dev Factory contract for creating ERC20 tokens on LaunchStream platform
 */
contract ERC20Factory {
    address public treasury;
    uint256 public creationFee = 0.01 ether; // Fee for creating tokens
    
    mapping(address => bool) public createdTokens;
    mapping(address => address[]) public tokensByCreator;
    address[] public allTokens;
    
    event TokenCreated(
        address indexed tokenAddress,
        address indexed creator,
        string name,
        string symbol,
        uint256 totalSupply,
        uint8 decimals
    );
    
    event FeeUpdated(uint256 newFee);
    event TreasuryUpdated(address newTreasury);
    
    modifier onlyTreasury() {
        require(msg.sender == treasury, "Only treasury can call this");
        _;
    }
    
    constructor(address _treasury) {
        treasury = _treasury;
    }
    
    /**
     * @dev Creates a new ERC20 token
     * @param _name Token name
     * @param _symbol Token symbol
     * @param _totalSupply Total supply (without decimals)
     * @param _decimals Number of decimals
     * @param _owner Token owner address
     * @return Token contract address
     */
    function createToken(
        string memory _name,
        string memory _symbol,
        uint256 _totalSupply,
        uint8 _decimals,
        address _owner
    ) external payable returns (address) {
        require(msg.value >= creationFee, "Insufficient fee");
        require(_totalSupply > 0, "Total supply must be greater than 0");
        require(_owner != address(0), "Invalid owner address");
        require(bytes(_name).length > 0, "Name cannot be empty");
        require(bytes(_symbol).length > 0, "Symbol cannot be empty");
        
        // Create new token contract
        ERC20Token newToken = new ERC20Token(
            _name,
            _symbol,
            _totalSupply,
            _decimals,
            _owner
        );
        
        address tokenAddress = address(newToken);
        
        // Update mappings
        createdTokens[tokenAddress] = true;
        tokensByCreator[_owner].push(tokenAddress);
        allTokens.push(tokenAddress);
        
        // Transfer fee to treasury
        if (msg.value > 0) {
            payable(treasury).transfer(msg.value);
        }
        
        emit TokenCreated(
            tokenAddress,
            _owner,
            _name,
            _symbol,
            _totalSupply,
            _decimals
        );
        
        return tokenAddress;
    }
    
    /**
     * @dev Get tokens created by a specific address
     * @param _creator Creator address
     * @return Array of token addresses
     */
    function getTokensByCreator(address _creator) external view returns (address[] memory) {
        return tokensByCreator[_creator];
    }
    
    /**
     * @dev Get total number of tokens created
     */
    function getTotalTokens() external view returns (uint256) {
        return allTokens.length;
    }
    
    /**
     * @dev Update creation fee (only treasury)
     * @param _newFee New fee amount
     */
    function updateCreationFee(uint256 _newFee) external onlyTreasury {
        creationFee = _newFee;
        emit FeeUpdated(_newFee);
    }
    
    /**
     * @dev Update treasury address (only current treasury)
     * @param _newTreasury New treasury address
     */
    function updateTreasury(address _newTreasury) external onlyTreasury {
        require(_newTreasury != address(0), "Invalid treasury address");
        treasury = _newTreasury;
        emit TreasuryUpdated(_newTreasury);
    }
}"
    },
    "LaunchStream/contracts/contracts/ERC20Token.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

/**
 * @title LaunchStream ERC20 Token
 * @dev Standard ERC20 token implementation for LaunchStream platform
 */
contract ERC20Token {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;
    address public owner;
    
    mapping(address => uint256) private balances;
    mapping(address => mapping(address => uint256)) private allowances;
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Not the owner");
        _;
    }
    
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _totalSupply,
        uint8 _decimals,
        address _owner
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalSupply * 10**_decimals;
        owner = _owner;
        balances[_owner] = totalSupply;
        emit Transfer(address(0), _owner, totalSupply);
    }
    
    function balanceOf(address account) public view returns (uint256) {
        return balances[account];
    }
    
    function transfer(address to, uint256 amount) public returns (bool) {
        require(balances[msg.sender] >= amount, "Insufficient balance");
        balances[msg.sender] -= amount;
        balances[to] += amount;
        emit Transfer(msg.sender, to, amount);
        return true;
    }
    
    function allowance(address tokenOwner, address spender) public view returns (uint256) {
        return allowances[tokenOwner][spender];
    }
    
    function approve(address spender, uint256 amount) public returns (bool) {
        allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        require(balances[from] >= amount, "Insufficient balance");
        require(allowances[from][msg.sender] >= amount, "Insufficient allowance");
        
        balances[from] -= amount;
        balances[to] += amount;
        allowances[from][msg.sender] -= amount;
        
        emit Transfer(from, to, amount);
        return true;
    }
}"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, Token, Factory|addr:0xa3fa8d39b267e84bb2bad9eef93655ae04e1c4cd|verified:true|block:23680320|tx:0xbce32a49b0cac0ce2582d30ad088e4bf4edc872f3a81d13ad5b481317020ce73|first_check:1761730338

Submitted on: 2025-10-29 10:32:18

Comments

Log in to comment.

No comments yet.