NodexDeploy

Description:

Multi-signature wallet contract requiring multiple confirmations for transaction execution.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "nodexlab.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.26;\r
\r
/*\r
 *  NodexLAB.IO (NODEX)\r
 *  https://nodexlab.io/\r
\r
 *  - Supply:      100,000,000 * 10^9 (100M tokens, 9 decimals)\r
 *  - Tax:         Fixed 5% on all non-owner transfers (buys & sells). Non-changeable.\r
 *  - Distribution: 50% Marketing, 50% Development (constructor-set wallets).\r
 *  - Auto-Sell:   Enabled. When contract token pot > 0.5% of supply and after 30 buys,\r
 *                 swaps tokens -> ETH via Uniswap V2 router and, if ETH >= 0.1,\r
 *                 distributes equally to Marketing & Development wallets.\r
 *  - Limits:      MaxTx = 1.5% supply, MaxWallet = 1.5% supply, enforced on BUYS ONLY\r
 *                 during the first 15 minutes after trading is opened.\r
 *  - Liquidity:   You will add liquidity manually via Uniswap UI.\r
 *  - Pair:        Owner sets the pair once created (`setPair(address)`).\r
 *  - Trading:     Owner opens trading time window & enables swaps via `setTradingOpen()`.\r
 *\r
 *  Notes:\r
 *  - Owner is exempt from fees to allow clean LP provisioning and treasury ops.\r
 *  - Manual test helpers: manualSwap(), manualSendETH(amount), manualSendTokens().\r
 */\r
\r
interface IERC20 {\r
    function totalSupply() external view returns (uint256);\r
    function balanceOf(address account) external view returns (uint256);\r
    function allowance(address owner, address spender) external view returns (uint256);\r
    function approve(address spender, uint256 amount) external returns (bool);\r
    function transfer(address recipient, uint256 amount) external returns (bool);\r
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r
    event Transfer(address indexed from, address indexed to, uint256 value);\r
    event Approval(address indexed owner, address indexed spender, uint256 value);\r
}\r
\r
abstract contract Ownable {\r
    address private _owner;\r
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r
    constructor() { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); }\r
    function owner() public view returns (address) { return _owner; }\r
    modifier onlyOwner() { require(msg.sender == _owner, "Ownable: caller is not the owner"); _; }\r
    function renounceOwnership() external onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); }\r
}\r
\r
interface IUniswapV2Router02 {\r
    function factory() external pure returns (address);\r
    function WETH() external pure returns (address);\r
    function swapExactTokensForETHSupportingFeeOnTransferTokens(\r
        uint amountIn,\r
        uint amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint deadline\r
    ) external;\r
}\r
\r
contract NodexDeploy is IERC20, Ownable {\r
    // --- Token data ---\r
    string private constant _NAME   = "NodexLAB.IO";\r
    string private constant _SYMBOL = "NODEX";\r
    uint8  private constant _DECIMALS = 9;\r
    uint256 private constant _SUPPLY = 100_000_000 * 10**_DECIMALS; // 100M\r
\r
    // --- Accounting ---\r
    mapping(address => uint256) private _bal;\r
    mapping(address => mapping(address => uint256)) private _allow;\r
\r
    // --- Fee / distribution ---\r
    uint256 private constant TAX_RATE = 5; // fixed 5%\r
    address payable public marketingWallet;\r
    address payable public developmentWallet;\r
\r
    // --- Auto-sell / thresholds ---\r
    uint256 public constant TAX_SWAP_THRESHOLD = 500_000 * 10**_DECIMALS; // 0.5% of supply\r
    uint256 public constant MIN_BUYS_BEFORE_SWAP = 30;\r
    uint256 public buyCount;\r
    bool    public swapEnabled;\r
\r
    // --- Launch limits (buy-only during first 15 min) ---\r
    uint256 public constant MAX_TX = 1_500_000 * 10**_DECIMALS;     // 1.5%\r
    uint256 public constant MAX_WALLET = 1_500_000 * 10**_DECIMALS; // 1.5%\r
    uint256 public launchTime; // set by setTradingOpen()\r
    mapping(address => bool) public isExcludedFromLimits; // excludes only from early buy caps\r
\r
    // --- DEX Router / Pair ---\r
    IUniswapV2Router02 private immutable _router; // Uniswap V2 router (mainnet)\r
    address public pair;                          // Set once after creating the pair\r
    bool public tradingOpen;                      // gating the early-limit window\r
\r
    // --- Internal swap lock ---\r
    bool private _inSwap;\r
    modifier swapping() { _inSwap = true; _; _inSwap = false; }\r
\r
    // --- Events ---\r
    event TradingOpened(uint256 at);\r
    event PairSet(address pair);\r
    event AutoSwap(uint256 tokensSold, uint256 ethReceived);\r
    event Payout(uint256 totalEth, uint256 halfEach);\r
\r
    constructor(address _marketing, address _development) {\r
        require(_marketing != address(0) && _development != address(0), "wallet=0");\r
        marketingWallet   = payable(_marketing);\r
        developmentWallet = payable(_development);\r
\r
        _bal[msg.sender] = _SUPPLY;\r
        isExcludedFromLimits[msg.sender] = true;\r
        isExcludedFromLimits[address(this)] = true;\r
        isExcludedFromLimits[marketingWallet] = true;\r
        isExcludedFromLimits[developmentWallet] = true;\r
\r
        // Uniswap V2 router (Ethereum mainnet)\r
        _router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);\r
\r
        emit Transfer(address(0), msg.sender, _SUPPLY);\r
    }\r
\r
    // --- ERC20 ---\r
    function name() external pure returns (string memory) { return _NAME; }\r
    function symbol() external pure returns (string memory) { return _SYMBOL; }\r
    function decimals() external pure returns (uint8) { return _DECIMALS; }\r
    function totalSupply() external pure override returns (uint256) { return _SUPPLY; }\r
    function balanceOf(address account) public view override returns (uint256) { return _bal[account]; }\r
    function allowance(address owner_, address spender) external view override returns (uint256) { return _allow[owner_][spender]; }\r
\r
    function approve(address spender, uint256 amount) public override returns (bool) {\r
        _allow[msg.sender][spender] = amount;\r
        emit Approval(msg.sender, spender, amount);\r
        return true;\r
    }\r
\r
    function transfer(address to, uint256 amount) external override returns (bool) {\r
        _transfer(msg.sender, to, amount);\r
        return true;\r
    }\r
\r
    function transferFrom(address from, address to, uint256 amount) external override returns (bool) {\r
        _transfer(from, to, amount);\r
        uint256 curr = _allow[from][msg.sender];\r
        require(curr >= amount, "allowance");\r
        unchecked { _allow[from][msg.sender] = curr - amount; }\r
        return true;\r
    }\r
\r
    // --- Internal transfer logic ---\r
    function _transfer(address from, address to, uint256 amount) internal {\r
        require(from != address(0) && to != address(0), "zero addr");\r
        require(amount > 0, "amt=0");\r
\r
        uint256 fromBal = _bal[from];\r
        require(fromBal >= amount, "bal");\r
\r
        // Fee applies when neither side is owner and not in internal swap\r
        uint256 tax = 0;\r
        if (!_inSwap && from != owner() && to != owner()) {\r
            tax = (amount * TAX_RATE) / 100;\r
        }\r
\r
        // Early buy caps: buys only, first 15 minutes after trading open\r
        if (tradingOpen && launchTime != 0 && from == pair && to != address(_router) && !isExcludedFromLimits[to]) {\r
            if (block.timestamp < launchTime + 15 minutes) {\r
                require(amount <= MAX_TX, "maxTx");\r
                require(_bal[to] + (amount - tax) <= MAX_WALLET, "maxWallet");\r
            }\r
            buyCount += 1;\r
        }\r
\r
        // Auto-sell on sells/transfers (i.e., when from != pair) once thresholds met\r
        if (from != pair && !_inSwap && swapEnabled) {\r
            uint256 pot = _bal[address(this)];\r
            if (pot > TAX_SWAP_THRESHOLD && buyCount > MIN_BUYS_BEFORE_SWAP) {\r
                _swapTokensForETH(pot);\r
                uint256 ethBal = address(this).balance;\r
                if (ethBal >= 0.1 ether) {\r
                    _payout(ethBal);\r
                }\r
            }\r
        }\r
\r
        unchecked {\r
            _bal[from] = fromBal - amount;\r
            _bal[to] += (amount - tax);\r
        }\r
        if (tax > 0) {\r
            _bal[address(this)] += tax;\r
            emit Transfer(from, address(this), tax);\r
        }\r
        emit Transfer(from, to, amount - tax);\r
    }\r
\r
    // --- Swapping & payouts ---\r
    function _swapTokensForETH(uint256 amount) internal swapping {\r
        address[] memory path = new address[](2);\r
        path[0] = address(this);\r
        path[1] = _router.WETH();\r
        _approveInternal(address(this), address(_router), amount);\r
        uint256 beforeBal = address(this).balance;\r
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(\r
            amount, 0, path, address(this), block.timestamp\r
        );\r
        uint256 gained = address(this).balance - beforeBal;\r
        emit AutoSwap(amount, gained);\r
    }\r
\r
    function _payout(uint256 amount) internal {\r
        uint256 half = amount / 2;\r
        _safeSend(marketingWallet, half);\r
        _safeSend(developmentWallet, amount - half); // remainder to dev\r
        emit Payout(amount, half);\r
    }\r
\r
    function _safeSend(address payable to, uint256 value) internal {\r
        (bool ok, ) = to.call{value: value}("");\r
        require(ok, "eth send failed");\r
    }\r
\r
    function _approveInternal(address owner_, address spender, uint256 amount) internal {\r
        _allow[owner_][spender] = amount;\r
        emit Approval(owner_, spender, amount);\r
    }\r
\r
    // --- Admin / Ops ---\r
\r
    /// @notice Set the UniswapV2 pair address once you've created it.\r
    function setPair(address pair_) external onlyOwner {\r
        require(pair == address(0), "pair set");\r
        require(pair_ != address(0), "pair=0");\r
        pair = pair_;\r
        emit PairSet(pair_);\r
    }\r
\r
    /// @notice Open trading window (starts the 15-minute limit period) and enable swapbacks.\r
    function setTradingOpen() external onlyOwner {\r
        require(!tradingOpen, "open");\r
        tradingOpen = true;\r
        swapEnabled = true;\r
        launchTime = block.timestamp;\r
        emit TradingOpened(launchTime);\r
    }\r
\r
    /// @notice Manual swap of contract's token pot to ETH (testing/helper).\r
    function manualSwap() external onlyOwner {\r
        uint256 pot = _bal[address(this)];\r
        require(pot > 0, "no tokens");\r
        _swapTokensForETH(pot);\r
    }\r
\r
    /// @notice Manual ETH send to wallets (testing/helper).\r
    function manualSendETH(uint256 amount) external onlyOwner {\r
        require(address(this).balance >= amount, "not enough ETH");\r
        _payout(amount);\r
    }\r
\r
    /// @notice Manual token send (withdraw taxed tokens) to owner (testing/helper).\r
    function manualSendTokens() external onlyOwner {\r
        uint256 pot = _bal[address(this)];\r
        require(pot > 0, "no tokens");\r
        _transfer(address(this), msg.sender, pot);\r
    }\r
\r
    // Accept ETH from router swaps\r
    receive() external payable {}\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, Multisig, Swap, Liquidity, Multi-Signature, Factory|addr:0xb5d83ec08bf83bea7b9ed5ef1637aa1fa99a0438|verified:true|block:23630607|tx:0xc5fa09337b07ce68a29b5f90c26ad1de97c709e65a9df4e0b320d3bba3ef1938|first_check:1761235816

Submitted on: 2025-10-23 18:10:19

Comments

Log in to comment.

No comments yet.