账户
0xfc...629c
0xFC...629c

0xFC...629c

US$0.00
此合同的源代码已经过验证!
合同元数据
编译器
0.8.22+commit.4fc1097e
语言
Solidity
合同源代码
文件 1 的 9:AIFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./AIToken.sol";
import "./GPT4AntiWhaleERC20.sol";
import "./GPT4ERC20.sol";
import "./BitTensorERC20.sol";
import "./BitTensorAntiWhaleERC20.sol";
import "./Ownable.sol";
import "./IERC20.sol";

contract AIFactory is Ownable {
    uint256 public deploymentFee;
    address[] public deployedTokens;
    event TokenDeployed(address indexed tokenAddress, address indexed owner, string name, string ipfsHash);
    constructor(uint256 _deploymentFee) Ownable(msg.sender) {
        deploymentFee = _deploymentFee;
    }

    receive() external payable {}
    function setDeploymentFee(uint256 _newFee) external onlyOwner {
        deploymentFee = _newFee;
    }

    function createToken(
        string memory _name, 
        string memory _symbol, 
        uint _initialSupply,
        string memory ipfsHash, 
        string memory model,
        bool isPremium, 
        bool isAntiwhale
    ) public payable returns (address) {

        IERC20 newToken;

        if (!isPremium) {
            newToken = new AIToken();
        } else if (keccak256(abi.encodePacked(model)) == keccak256(abi.encodePacked("GPT-4"))) {
            require(msg.value == deploymentFee, "Insufficient");
            if (isAntiwhale) {
                newToken = new GPT4AntiWhaleERC20();
            } else {
                newToken = new GPT4ERC20();
            }
        } else if (keccak256(abi.encodePacked(model)) == keccak256(abi.encodePacked("BitTensor"))) {
            require(msg.value == deploymentFee, "no fee");
            if (isAntiwhale) {
                newToken = new BitTensorAntiWhaleERC20();
            } else {
                newToken = new BitTensorERC20();
            }
        } else {
            revert("No model");
        }
        
        newToken.initialize(_name, _symbol, _initialSupply, msg.sender);

        deployedTokens.push(address(newToken));
        emit TokenDeployed(address(newToken), msg.sender, _name, ipfsHash);

        return address(newToken);
    }

    function getDeployedTokens() external view returns (address[] memory) {
        return deployedTokens;
    }

    function withdrawFees(address payable to) external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No fees");
        to.transfer(balance);
    }
}
合同源代码
文件 2 的 9:AIToken.sol
// SPDX-License-Identifier: MIT
/*
 █████╗ ██╗              
██╔══██╗██║              
███████║██║              
██╔══██║██║              
██║  ██║██║              
╚═╝  ╚═╝╚═╝              
██╗███████╗              
██║██╔════╝              
██║███████╗              
██║╚════██║              
██║███████║              
╚═╝╚══════╝              
██████╗ ███████╗██╗   ██╗
██╔══██╗██╔════╝██║   ██║
██║  ██║█████╗  ██║   ██║
██║  ██║██╔══╝  ╚██╗ ██╔╝
██████╔╝███████╗ ╚████╔╝ 
╚═════╝ ╚══════╝  ╚═══╝  
*/
// This token was generated AND deployed using GPT-3.5 and DALLE-2 for FREE on https://aiis.dev! 
// All tokens deployed from this website adhere to basic token standards, ensuring secure code and compatibility among the blockchain ecosystem.
// Check it out now! https://aiis.dev

pragma solidity ^0.8.9;

import "./IERC20.sol";
import "./Ownable.sol";

contract AIToken is IERC20, Ownable {
    string public symbol;
    uint8 public decimals = 18;
    uint256 internal _totalSupply;
    string public name;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal allowances;

    address public factory;

   constructor() Ownable(_msgSender()){
        factory = msg.sender;
    }

    function initialize(
        string memory _name,
        string memory _symbol,
        uint256 _initialSupply,
        address _initialHolder
    ) external {
        require(msg.sender == factory, "only f");
        // Set the token details and credit the initial supply to _initialHolder
        name = _name;
        symbol = _symbol;
        _totalSupply = _initialSupply * (10 ** uint256(decimals));
        _balances[_initialHolder] = _totalSupply;
        emit Transfer(address(0), _initialHolder, _totalSupply);

        // Transfer ownership to the dead address
        transferOwnership(0x000000000000000000000000000000000000dEaD);
    }


    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) external virtual returns (bool) {
        require(msg.sender != address(0), "from 0"); // "ERC20: transfer from the zero address" -> "from 0"
        require(recipient != address(0), "to 0"); // "ERC20: transfer to the zero address" -> "to 0"
        require(_balances[msg.sender] >= amount, "low bal"); // "ERC20: insufficient balance" -> "low bal"

        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) external view override returns (uint256) {
        return allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        require(msg.sender != address(0), "from 0"); // "ERC20: approve from the zero address" -> "from 0"
        require(spender != address(0), "to 0"); // "ERC20: approve to the zero address" -> "to 0"

        allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external virtual returns (bool) {
        require(sender != address(0), "from 0"); // "ERC20: transfer from the zero address" -> "from 0"
        require(recipient != address(0), "to 0"); // "ERC20: transfer to the zero address" -> "to 0"
        require(_balances[sender] >= amount, "low bal"); // "ERC20: insufficient balance" -> "low bal"
        require(allowances[sender][msg.sender] >= amount, ">allowance"); // Shortened but kept clear

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        allowances[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        uint256 currentAllowance = allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "under 0"); // "ERC20: decreased allowance below zero" -> "under 0"
        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "from 0"); // "ERC20: approve from the zero address" -> "from 0"
        require(spender != address(0), "to 0"); // "ERC20: approve to the zero address" -> "to 0"

        allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}
合同源代码
文件 3 的 9:BitTensorAntiWhaleERC20.sol
// SPDX-License-Identifier: MIT
/*
 █████╗ ██╗              
██╔══██╗██║              
███████║██║              
██╔══██║██║              
██║  ██║██║              
╚═╝  ╚═╝╚═╝              
██╗███████╗              
██║██╔════╝              
██║███████╗              
██║╚════██║              
██║███████║              
╚═╝╚══════╝              
██████╗ ███████╗██╗   ██╗
██╔══██╗██╔════╝██║   ██║
██║  ██║█████╗  ██║   ██║
██║  ██║██╔══╝  ╚██╗ ██╔╝
██████╔╝███████╗ ╚████╔╝ 
╚═════╝ ╚══════╝  ╚═══╝  
*/
// This token was generated AND deployed using BitTensor on https://aiis.dev!
// Anti-Whale
// All tokens deployed from this website adhere to basic token standards, ensuring secure code and compatibility among the blockchain ecosystem.
// Check it out now! https://aiis.dev

pragma solidity ^0.8.9;

import "./AIToken.sol";

contract BitTensorAntiWhaleERC20 is AIToken {
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        require(sender != address(0), "from 0");
        require(recipient != address(0), "to 0");
        require(_balances[sender] >= amount, "insuff");
        require(
            allowances[sender][msg.sender] >= amount,
            ">allowance"
        );

        // Anti-Whale Logic for transferFrom
        require(
            amount <= (_totalSupply * 5) / 1000 || // Less than 0.5% of total supply
            amount >= (_totalSupply * 99) / 100,   // More than 99% of total supply
            "must be <0.5% or >99% of supply"
        );

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        allowances[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        require(msg.sender != address(0), "from 0");
        require(recipient != address(0), "to 0");
        require(_balances[msg.sender] >= amount, "insuff");

        // Anti-Whale Logic for transfer
        require(
            amount <= (_totalSupply * 5) / 1000 || // Less than 0.5% of total supply
            amount >= (_totalSupply * 99) / 100,   // More than 99% of total supply
            "must be <0.5% or >99% of supply"
        );

        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }
}
合同源代码
文件 4 的 9:BitTensorERC20.sol
// SPDX-License-Identifier: MIT
/*
 █████╗ ██╗              
██╔══██╗██║              
███████║██║              
██╔══██║██║              
██║  ██║██║              
╚═╝  ╚═╝╚═╝              
██╗███████╗              
██║██╔════╝              
██║███████╗              
██║╚════██║              
██║███████║              
╚═╝╚══════╝              
██████╗ ███████╗██╗   ██╗
██╔══██╗██╔════╝██║   ██║
██║  ██║█████╗  ██║   ██║
██║  ██║██╔══╝  ╚██╗ ██╔╝
██████╔╝███████╗ ╚████╔╝ 
╚═════╝ ╚══════╝  ╚═══╝  
*/
// This token was generated AND deployed using BitTensor on https://aiis.dev! 
// All tokens deployed from this website adhere to basic token standards, ensuring secure code and compatibility among the blockchain ecosystem.
// Check it out now! https://aiis.dev

pragma solidity ^0.8.9;

import "./IERC20.sol";
import "./Ownable.sol";

contract BitTensorERC20 is IERC20, Ownable {
    string public name;
    string public symbol;
    uint256 internal _totalSupply;
    uint8 public decimals = 18;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal allowances;

    address public factory;

constructor() Ownable(_msgSender()){
        factory = msg.sender;
    }

    function initialize(
        string memory _name,
        string memory _symbol,
        uint256 _initialSupply,
        address _initialHolder
    ) external {
        require(msg.sender == factory, "only f");
        // Set the token details and credit the initial supply to _initialHolder
        name = _name;
        symbol = _symbol;
        _totalSupply = _initialSupply * (10 ** uint256(decimals));
        _balances[_initialHolder] = _totalSupply;
        emit Transfer(address(0), _initialHolder, _totalSupply);

        // Transfer ownership to the dead address
        transferOwnership(0x000000000000000000000000000000000000dEaD);
    }


    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(
        address account
    ) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
) external virtual returns (bool) {
        require(
            msg.sender != address(0),
            "from 0"
        );
        require(recipient != address(0), "to 0");
        require(_balances[msg.sender] >= amount, "insuff");

        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) external view override returns (uint256) {
        return allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) external override returns (bool) {
        require(
            msg.sender != address(0),
            "approve 0"
        );
        require(spender != address(0), "approve 0");

        allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

   function transferFrom(
    address sender,
    address recipient,
    uint256 amount
) external virtual returns (bool) {
    require(sender != address(0), "from 0");
    require(recipient != address(0), "to 0");
    require(_balances[sender] >= amount, "insuff");
    require(
        allowances[sender][msg.sender] >= amount,
        ">allowance"
    );

    _balances[sender] -= amount;
    _balances[recipient] += amount;
    allowances[sender][msg.sender] -= amount;
    emit Transfer(sender, recipient, amount);
    return true;
}


    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public returns (bool) {
        _approve(
            msg.sender,
            spender,
            allowances[msg.sender][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public returns (bool) {
        uint256 currentAllowance = allowances[msg.sender][spender];
        require(
            currentAllowance >= subtractedValue,
            "allowance<0"
        );
        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "approve 0");
        require(spender != address(0), "approve 0");

        allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}
合同源代码
文件 5 的 9:Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
合同源代码
文件 6 的 9:GPT4AntiWhaleERC20.sol
// SPDX-License-Identifier: MIT
/*
 █████╗ ██╗              
██╔══██╗██║              
███████║██║              
██╔══██║██║              
██║  ██║██║              
╚═╝  ╚═╝╚═╝              
██╗███████╗              
██║██╔════╝              
██║███████╗              
██║╚════██║              
██║███████║              
╚═╝╚══════╝              
██████╗ ███████╗██╗   ██╗
██╔══██╗██╔════╝██║   ██║
██║  ██║█████╗  ██║   ██║
██║  ██║██╔══╝  ╚██╗ ██╔╝
██████╔╝███████╗ ╚████╔╝ 
╚═════╝ ╚══════╝  ╚═══╝  
*/
// This token was generated AND deployed using GPT-4 and DALLE-3 on https://aiis.dev!
// Anti-Whale
// All tokens deployed from this website adhere to basic token standards, ensuring secure code and compatibility among the blockchain ecosystem.
// Check it out now! https://aiis.dev

pragma solidity ^0.8.9;

import "./AIToken.sol";

contract GPT4AntiWhaleERC20 is AIToken {
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        require(sender != address(0), "from 0");
        require(recipient != address(0), "to 0");
        require(_balances[sender] >= amount, ">bal");
        require(
            allowances[sender][msg.sender] >= amount,
            ">bal"
        );

        // Anti-Whale Logic for transferFrom
        require(
            amount <= (_totalSupply * 5) / 1000 || // Less than 0.5% of total supply
            amount >= (_totalSupply * 99) / 100,   // More than 99% of total supply
            "must be >0.5% or <99% of supply"
        );

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        allowances[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        require(msg.sender != address(0), "from 0");
        require(recipient != address(0), "to 0");
        require(_balances[msg.sender] >= amount, "insuff");

        // Anti-Whale Logic for transfer
        require(
            amount <= (_totalSupply * 5) / 1000 || // Less than 0.5% of total supply
            amount >= (_totalSupply * 99) / 100,   // More than 99% of total supply
            "must be >0.5% or <99% of supply"
        );

        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }
}
合同源代码
文件 7 的 9:GPT4ERC20.sol
// SPDX-License-Identifier: MIT
/*
 █████╗ ██╗              
██╔══██╗██║              
███████║██║              
██╔══██║██║              
██║  ██║██║              
╚═╝  ╚═╝╚═╝              
██╗███████╗              
██║██╔════╝              
██║███████╗              
██║╚════██║              
██║███████║              
╚═╝╚══════╝              
██████╗ ███████╗██╗   ██╗
██╔══██╗██╔════╝██║   ██║
██║  ██║█████╗  ██║   ██║
██║  ██║██╔══╝  ╚██╗ ██╔╝
██████╔╝███████╗ ╚████╔╝ 
╚═════╝ ╚══════╝  ╚═══╝  
*/
// This token was generated AND deployed using GPT-4 and DALLE-3 on https://aiis.dev! 
// All tokens deployed from this website adhere to basic token standards, ensuring secure code and compatibility among the blockchain ecosystem.
// Check it out now! https://aiis.dev

pragma solidity ^0.8.9;

import "./IERC20.sol";
import "./Ownable.sol";

contract GPT4ERC20 is IERC20, Ownable {
    string public name;
    uint8 public decimals = 18;
    string public symbol;
    uint256 internal _totalSupply;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal allowances;

    address public factory;

    constructor() Ownable(_msgSender()){
        factory = msg.sender;
    }

    function initialize(
        string memory _name,
        string memory _symbol,
        uint256 _initialSupply,
        address _initialHolder
    ) external {
        require(msg.sender == factory, "only f");
        // Set the token details and credit the initial supply to _initialHolder
        name = _name;
        symbol = _symbol;
        _totalSupply = _initialSupply * (10 ** uint256(decimals));
        _balances[_initialHolder] = _totalSupply;
        emit Transfer(address(0), _initialHolder, _totalSupply);

        // Transfer ownership to the dead address
        transferOwnership(0x000000000000000000000000000000000000dEaD);
    }


    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(
        address account
    ) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
) external virtual returns (bool) {
        require(
            msg.sender != address(0),
            "from 0"
        );
        require(recipient != address(0), "to 0");
        require(_balances[msg.sender] >= amount, "insufficient bal");

        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) external view override returns (uint256) {
        return allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) external override returns (bool) {
        require(
            msg.sender != address(0),
            "approve 0"
        );
        require(spender != address(0), "approve 0");

        allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

   function transferFrom(
    address sender,
    address recipient,
    uint256 amount
) external virtual returns (bool) {
    require(sender != address(0), "from 0");
    require(recipient != address(0), "to 0");
    require(_balances[sender] >= amount, "insuff");
    require(
        allowances[sender][msg.sender] >= amount,
        ">allowance"
    );

    _balances[sender] -= amount;
    _balances[recipient] += amount;
    allowances[sender][msg.sender] -= amount;
    emit Transfer(sender, recipient, amount);
    return true;
}


    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public returns (bool) {
        _approve(
            msg.sender,
            spender,
            allowances[msg.sender][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public returns (bool) {
        uint256 currentAllowance = allowances[msg.sender][spender];
        require(
            currentAllowance >= subtractedValue,
            "allowance<0"
        );
        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "approve 0");
        require(spender != address(0), "approve 0");

        allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}
合同源代码
文件 8 的 9:IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

interface IERC20 {

    function initialize(
        string memory _name,
        string memory _symbol,
        uint256 _initialSupply,
        address _initialHolder
    ) external;

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}
合同源代码
文件 9 的 9:Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
设置
{
  "compilationTarget": {
    "AIFactory.sol": "AIFactory"
  },
  "evmVersion": "shanghai",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[{"internalType":"uint256","name":"_deploymentFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"ipfsHash","type":"string"}],"name":"TokenDeployed","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"model","type":"string"},{"internalType":"bool","name":"isPremium","type":"bool"},{"internalType":"bool","name":"isAntiwhale","type":"bool"}],"name":"createToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deployedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deploymentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeployedTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setDeploymentFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]