ControllerFactory

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/ControllerFactory.sol": {
      "content": "// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.30;

contract ControllerFactory {
    
    mapping(address => Deployment) public deploymentsByController;
    mapping(address => Deployment[]) public deploymentsByUser;
    uint256 public totalDeployments;
    
    struct Deployment {
        address controller;
        address tokenContent;
        address token;
        address saleManager;
        uint256 timestamp;
        string projectName;
        address deployer;
    }
    
    // ✅ Structs to reduce stack depth
    struct ControllerParams {
        address projectSuperAddress;
        string platformName;
        address platformTreasuryAddress;
        string projectSuperName;
        string projectSuperId;
        string projectName;
        string projectId;
    }
    
    struct TokenParams {
        address initialAdmin;
        string tokenName;
        string tokenSymbol;
        string tokenDescription;
        uint256 maxSupply;
        uint8 decimals;
    }
    
    struct TokenContentParams {
        string tokenInfoBaseUrl;
        bytes32 tokenInfoHash;
    }
    
    struct SaleManagerParams {
        string issueTokenSymbol;
        address ethUsdPriceFeed;
        address usdtUsdPriceFeed;
        address usdcAddress;
        address usdtAddress;
    }
    
    event DeploymentComplete(
        address indexed deployer,
        address controller,
        address tokenContent,
        address token,
        address saleManager,
        string projectName,
        uint256 timestamp
    );
    
    constructor() {}
    
    function deployAll(
        bytes memory controllerBytecode,
        bytes memory tokenContentBytecode,
        bytes memory tokenBytecode,
        bytes memory saleManagerBytecode,
        ControllerParams memory controllerParams,
        TokenContentParams memory tokenContentParams,
        TokenParams memory tokenParams,
        SaleManagerParams memory saleManagerParams
    ) external returns (
        address controller,
        address tokenContent,
        address token,
        address saleManager
    ) {
        
        // Deploy all 4 contracts
        controller = _deploy(
            abi.encodePacked(
                controllerBytecode,
                abi.encode(
                    controllerParams.projectSuperAddress,
                    controllerParams.platformName,
                    controllerParams.platformTreasuryAddress,
                    controllerParams.projectSuperName,
                    controllerParams.projectSuperId,
                    controllerParams.projectName,
                    controllerParams.projectId
                )
            ),
            "Controller"
        );
        
        tokenContent = _deploy(
            abi.encodePacked(
                tokenContentBytecode,
                abi.encode(
                    controller,
                    tokenContentParams.tokenInfoBaseUrl,
                    tokenContentParams.tokenInfoHash
                )
            ),
            "TokenContent"
        );
        
        token = _deploy(
            abi.encodePacked(
                tokenBytecode,
                abi.encode(
                    controller,
                    tokenParams.initialAdmin,
                    tokenParams.tokenName,
                    tokenParams.tokenSymbol,
                    tokenParams.tokenDescription,
                    tokenParams.maxSupply,
                    tokenParams.decimals,
                    tokenContent
                )
            ),
            "Token"
        );
        
        saleManager = _deploy(
            abi.encodePacked(
                saleManagerBytecode,
                abi.encode(
                    controller,
                    token,
                    saleManagerParams.issueTokenSymbol,
                    saleManagerParams.ethUsdPriceFeed,
                    saleManagerParams.usdtUsdPriceFeed,
                    saleManagerParams.usdcAddress,
                    saleManagerParams.usdtAddress
                )
            ),
            "SaleManager"
        );
        
        // Register
        Deployment memory deployment = Deployment({
            controller: controller,
            tokenContent: tokenContent,
            token: token,
            saleManager: saleManager,
            timestamp: block.timestamp,
            projectName: controllerParams.projectName,
            deployer: msg.sender
        });
        
        deploymentsByController[controller] = deployment;
        deploymentsByUser[msg.sender].push(deployment);
        totalDeployments++;
        
        emit DeploymentComplete(
            msg.sender,
            controller,
            tokenContent,
            token,
            saleManager,
            controllerParams.projectName,
            block.timestamp
        );
        
        return (controller, tokenContent, token, saleManager);
    }
    
    function _deploy(bytes memory bytecodeWithParams, string memory label) internal returns (address deployed) {
        bytes32 salt = keccak256(abi.encodePacked(msg.sender, totalDeployments, label, block.timestamp));
        assembly ("memory-safe") {
            deployed := create2(0, add(bytecodeWithParams, 0x20), mload(bytecodeWithParams), salt)
        }
        require(deployed != address(0), string(abi.encodePacked(label, " deployment failed")));
    }
    
    // ========================================================================
    // VERIFICATION (Registry lookups - that's it!)
    // ========================================================================
    
    /**
     * @notice Verify if controller was deployed by this factory
     * @param controllerAddress Controller to check
     * @return isOfficial True if in registry (deployed by factory)
     * @return deployment Full deployment info (if official)
     */
    function isOfficialDeployment(address controllerAddress) 
        external view returns (bool isOfficial, Deployment memory deployment) 
    {
        deployment = deploymentsByController[controllerAddress];
        isOfficial = deployment.controller != address(0);
    }
    
    /**
     * @notice Get deployment info by controller address
     */
    function getDeployment(address controllerAddress) external view returns (Deployment memory) {
        return deploymentsByController[controllerAddress];
    }
    
    /**
     * @notice Get all deployments by a user
     */
    function getUserDeployments(address user) external view returns (Deployment[] memory) {
        return deploymentsByUser[user];
    }
    
    /**
     * @notice Get user's most recent deployment
     */
    function getLastDeployment(address user) external view returns (Deployment memory) {
        Deployment[] memory userDeps = deploymentsByUser[user];
        require(userDeps.length > 0, "No deployments");
        return userDeps[userDeps.length - 1];
    }
}"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 10000
    },
    "viaIR": true,
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    }
  }
}}

Tags:
Factory|addr:0xfae93bd47c74289b23f5b234a11c15b8c088d623|verified:true|block:23730662|tx:0xf1015a2c2e1ce2384c4516433be650c244411ff8deddad42f2980c893b2e2a2f|first_check:1762342891

Submitted on: 2025-11-05 12:41:33

Comments

Log in to comment.

No comments yet.