编译器
0.8.22+commit.4fc1097e
文件 1 的 9:AIFactory.sol
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
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");
name = _name;
symbol = _symbol;
_totalSupply = _initialSupply * (10 ** uint256(decimals));
_balances[_initialHolder] = _totalSupply;
emit Transfer(address(0), _initialHolder, _totalSupply);
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, "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");
require(spender != address(0), "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");
require(recipient != address(0), "to 0");
require(_balances[sender] >= amount, "low bal");
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, "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");
require(spender != address(0), "to 0");
allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
文件 3 的 9:BitTensorAntiWhaleERC20.sol
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"
);
require(
amount <= (_totalSupply * 5) / 1000 ||
amount >= (_totalSupply * 99) / 100,
"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");
require(
amount <= (_totalSupply * 5) / 1000 ||
amount >= (_totalSupply * 99) / 100,
"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
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");
name = _name;
symbol = _symbol;
_totalSupply = _initialSupply * (10 ** uint256(decimals));
_balances[_initialHolder] = _totalSupply;
emit Transfer(address(0), _initialHolder, _totalSupply);
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
pragma solidity ^0.8.20;
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
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"
);
require(
amount <= (_totalSupply * 5) / 1000 ||
amount >= (_totalSupply * 99) / 100,
"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");
require(
amount <= (_totalSupply * 5) / 1000 ||
amount >= (_totalSupply * 99) / 100,
"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
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");
name = _name;
symbol = _symbol;
_totalSupply = _initialSupply * (10 ** uint256(decimals));
_balances[_initialHolder] = _totalSupply;
emit Transfer(address(0), _initialHolder, _totalSupply);
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
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
pragma solidity ^0.8.20;
import {Context} from "./Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
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": []
}
[{"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"}]