{"ok":true,"contract":{"address":"0xba270a620cafaa69a97abcc4d83c850297ca05b2","contract_name":"BrainFactory","deployed":null,"fund":"0","fund_usd":"0.00000000","native_balance":"1155471448000000000","network":"subtensor","first_seen":"1779196931","verified":true,"is_proxy":false,"implementation_address":null,"proxy_contract_name":"BrainFactory","implementation_contract_name":null,"deploy_tx_hash":"0x4646f06742d23ca588b88247cd0f6e4dc6890fa5b1cbc7783033867421715cf7","deployer_address":"0x51537aea71428819f7720184a59124aaac3d064f","deploy_block_number":null,"deployed_at_timestamp":null,"deployed_at":null,"confidence":"precise","fetched_at":"2026-05-19T13:22:04.472Z","source_code":"// SPDX-License-Identifier: MIT\n// website: brain.fun\n// twitter: x.com/braintao\npragma solidity ^0.8.24;\n\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport \"./Token.sol\";\nimport \"./interfaces/IToken.sol\";\n\ncontract BrainFactory is ReentrancyGuard {\n    address public owner;\n\n    uint256 public virtualReserve;\n\n    // Fee rates (all tokens read from here)\n    uint256 public totalFeeRate;\n    uint256 public deployerFeeRate;\n\n    // Creator fee pool (pull pattern)\n    mapping(address => uint256) public creatorBalances;\n    uint256 public totalCreatorBalances;\n\n    // Token registry\n    uint256 public tokenCount;\n    mapping(uint256 => address) public tokenById;\n    mapping(address => uint256) public tokenIdByAddress;\n    mapping(address => uint256[]) public tokensByCreator;\n\n    // Events\n    event TokenCreated(\n        uint256 indexed tokenId,\n        address indexed tokenAddress,\n        address indexed creator,\n        string name,\n        string symbol,\n        string metadata,\n        uint256 timestamp\n    );\n    event CreatorFeeDeposited(address indexed creator, address indexed token, uint256 amount);\n    event CreatorFeeClaimed(address indexed creator, uint256 amount);\n    event FeesUpdated(uint256 oldTotal, uint256 oldDeployer, uint256 newTotal, uint256 newDeployer);\n    event VirtualReserveUpdated(uint256 oldReserve, uint256 newReserve);\n    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"not owner\");\n        _;\n    }\n\n    constructor() {\n        owner = msg.sender;\n        virtualReserve = 10 ether;\n        totalFeeRate = 100;\n        deployerFeeRate = 50;\n    }\n\n    // ──── Token Creation ────\n\n    function createToken(\n        string calldata _name,\n        string calldata _symbol,\n        string calldata _metadata\n    ) external payable returns (uint256 tokenId, address tokenAddress) {\n        require(bytes(_name).length > 0 && bytes(_name).length <= 32, \"invalid name\");\n        require(bytes(_symbol).length > 0 && bytes(_symbol).length <= 10, \"invalid symbol\");\n\n        tokenCount += 1;\n\n        Token token = new Token(_name, _symbol, _metadata, msg.sender, address(this), virtualReserve);\n\n        tokenById[tokenCount] = address(token);\n        tokenIdByAddress[address(token)] = tokenCount;\n        tokensByCreator[msg.sender].push(tokenCount);\n\n        // Optional initial buy in the same tx (prevents frontrunning)\n        if (msg.value > 0) {\n            IToken(address(token)).buyFor{value: msg.value}(msg.sender, 0, block.timestamp);\n        }\n\n        emit TokenCreated(tokenCount, address(token), msg.sender, _name, _symbol, _metadata, block.timestamp);\n\n        return (tokenCount, address(token));\n    }\n\n    // ──── Creator Fee Pool ────\n\n    /// @notice Called by token contracts to deposit creator fees\n    function depositCreatorFee(address _creator) external payable {\n        require(tokenIdByAddress[msg.sender] > 0, \"only tokens\");\n        creatorBalances[_creator] += msg.value;\n        totalCreatorBalances += msg.value;\n        emit CreatorFeeDeposited(_creator, msg.sender, msg.value);\n    }\n\n    /// @notice Allows creators to withdraw their accumulated fees\n    function claimCreatorFees() external nonReentrant {\n        uint256 amount = creatorBalances[msg.sender];\n        require(amount > 0, \"nothing to claim\");\n        creatorBalances[msg.sender] = 0;\n        totalCreatorBalances -= amount;\n        (bool success,) = payable(msg.sender).call{value: amount}(\"\");\n        require(success, \"claim failed\");\n        emit CreatorFeeClaimed(msg.sender, amount);\n    }\n\n    // ──── Rescue ────\n\n    receive() external payable {}\n\n    /// @notice Recovers accidentally sent TAO (excludes creator balances)\n    function rescueTAO() external onlyOwner {\n        uint256 rescuable = address(this).balance - totalCreatorBalances;\n        require(rescuable > 0, \"nothing to rescue\");\n        (bool success,) = payable(owner).call{value: rescuable}(\"\");\n        require(success, \"rescue failed\");\n    }\n\n    // ──── View ────\n\n    function getFees() external view returns (uint256, uint256) {\n        return (totalFeeRate, deployerFeeRate);\n    }\n\n    function getCreatorBalance(address _creator) external view returns (uint256) {\n        return creatorBalances[_creator];\n    }\n\n    function getTokenCount() external view returns (uint256) {\n        return tokenCount;\n    }\n\n    function getToken(uint256 id) external view returns (address) {\n        return tokenById[id];\n    }\n\n    function getTokenInfo(uint256 id)\n        external\n        view\n        returns (\n            address tokenAddress,\n            string memory _name,\n            string memory _symbol,\n            string memory _metadata,\n            address _creator,\n            uint256 _createdAt,\n            uint256 _price,\n            uint256 _virtualTaoReserve,\n            uint256 _realTaoReserve,\n            uint256 _tokenReserve,\n            uint256 _totalVolumeTao,\n            uint256 _totalTrades,\n            uint256 _marketCap\n        )\n    {\n        tokenAddress = tokenById[id];\n        require(tokenAddress != address(0), \"token not found\");\n        (\n            _name,\n            _symbol,\n            _metadata,\n            _creator,\n            _createdAt,\n            _price,\n            _virtualTaoReserve,\n            _realTaoReserve,\n            _tokenReserve,\n            _totalVolumeTao,\n            _totalTrades,\n            _marketCap\n        ) = IToken(tokenAddress).getTokenInfo();\n    }\n\n    function getTokens(uint256 offset, uint256 limit)\n        external\n        view\n        returns (address[] memory tokenAddresses, uint256[] memory ids)\n    {\n        uint256 end = offset + limit;\n        if (end > tokenCount) end = tokenCount;\n        uint256 count = end > offset ? end - offset : 0;\n\n        tokenAddresses = new address[](count);\n        ids = new uint256[](count);\n\n        for (uint256 i = 0; i < count; i++) {\n            uint256 id = offset + i + 1;\n            ids[i] = id;\n            tokenAddresses[i] = tokenById[id];\n        }\n    }\n\n    function getTokensByCreator(address _creator) external view returns (uint256[] memory) {\n        return tokensByCreator[_creator];\n    }\n\n    function getCreatorTokenCount(address _creator) external view returns (uint256) {\n        return tokensByCreator[_creator].length;\n    }\n\n    // ──── Admin ────\n\n    function setFees(uint256 _totalFeeRate, uint256 _deployerFeeRate) external onlyOwner {\n        require(_totalFeeRate <= 1000, \"max 10%\");\n        require(_deployerFeeRate <= _totalFeeRate, \"deployer > total\");\n        uint256 oldTotal = totalFeeRate;\n        uint256 oldDeployer = deployerFeeRate;\n        totalFeeRate = _totalFeeRate;\n        deployerFeeRate = _deployerFeeRate;\n        emit FeesUpdated(oldTotal, oldDeployer, _totalFeeRate, _deployerFeeRate);\n    }\n\n    function setVirtualReserve(uint256 newReserve) external onlyOwner {\n        require(newReserve > 0, \"reserve must be > 0\");\n        uint256 oldReserve = virtualReserve;\n        virtualReserve = newReserve;\n        emit VirtualReserveUpdated(oldReserve, newReserve);\n    }\n\n    function transferOwnership(address newOwner) external onlyOwner {\n        require(newOwner != address(0), \"zero address\");\n        address oldOwner = owner;\n        owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}","source_code_hash":null,"compiler_version":"v0.8.24+commit.e11b9ed9","optimization_used":"true","runs":null,"abi":"[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreatorFeeClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreatorFeeDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldTotal\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDeployer\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTotal\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDeployer\",\"type\":\"uint256\"}],\"name\":\"FeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"TokenCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldReserve\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newReserve\",\"type\":\"uint256\"}],\"name\":\"VirtualReserveUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"claimCreatorFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_metadata\",\"type\":\"string\"}],\"name\":\"createToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"creatorBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deployerFeeRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"}],\"name\":\"depositCreatorFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"}],\"name\":\"getCreatorBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"}],\"name\":\"getCreatorTokenCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getTokenInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_metadata\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_virtualTaoReserve\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_realTaoReserve\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_tokenReserve\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_totalVolumeTao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_totalTrades\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_marketCap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"tokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"}],\"name\":\"getTokensByCreator\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rescueTAO\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalFeeRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_deployerFeeRate\",\"type\":\"uint256\"}],\"name\":\"setFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newReserve\",\"type\":\"uint256\"}],\"name\":\"setVirtualReserve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenById\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenIdByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokensByCreator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalCreatorBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalFeeRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"virtualReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]","contract_file_name":null,"compiler_type":null,"evm_version":"cancun","constructor_arguments":null,"library":null,"license_type":null,"critical_count":0,"high_count":1,"medium_count":2,"low_count":0,"informational_count":0,"audit_status":"completed","audit_completed_at":"1779423732396","erc20_balances":[]}}