Skip to main content
PulseScanner.io

Address

0x899eb8a52dfa070eb2f2ed2eaa4f527339b33404
Current Holdings
$0.00
TXs sent
not counted
First Active
2025-10-22
block 24,823,052
Last Active
297 days ago
block 25,088,555
Funded By
not identified

Net worth historyi

No net-worth snapshots recorded yet
exact matchPTRAILX1solc 0.8.29+commit.ab55807cruntime exact · creation exact
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface IERC20 {
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
}

contract PTRAILX1 {
    string public constant name = "PTRAILX";
    string public constant symbol = "PTRAILX";
    uint8 public constant decimals = 18;
    uint256 public totalSupply;

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

    address public owner;
    address public lpPair;
    address constant PTRAIL = 0x146c165DD68bCe30bF75B46010eF12605A315e14; // PTRAIL for minting

    uint256 public constant MINT_PRICE = 4 * 10**18;   // 1 PTRAILX = 4 PTRAIL
    uint256 public constant SELLBACK_RATIO = 50;
    uint256 public constant DEX_SELL_TAX = 40;

    address public stakingContract;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Mint(address indexed to, uint256 amount);
    event SellBack(address indexed from, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event DexSellTaxed(address indexed from, uint256 taxedAmount);

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    modifier onlyStaking() {
        require(msg.sender == stakingContract, "Not staking contract");
        _;
    }

    constructor(address _owner) {
        owner = _owner;
    }

    function mint(uint256 quantity) external {
        require(quantity > 0, "Quantity must be > 0");
        uint256 totalCost = quantity * MINT_PRICE;
        require(IERC20(PTRAIL).transferFrom(msg.sender, owner, totalCost), "Payment failed");

        uint256 amount = quantity * 10**decimals;
        balanceOf[msg.sender] += amount;
        totalSupply += amount;

        emit Transfer(address(0), msg.sender, amount);
        emit Mint(msg.sender, amount);
    }

    function mintFromStakingContract(address to, uint256 quantity) external onlyStaking {
        require(quantity > 0, "Quantity must be > 0");
        uint256 pTrailNeeded = quantity * MINT_PRICE;
        require(IERC20(PTRAIL).balanceOf(msg.sender) >= pTrailNeeded, "Not enough PTRAIL in staking");

        IERC20(PTRAIL).transferFrom(msg.sender, owner, pTrailNeeded);

        uint256 amount = quantity * 10**decimals;
        balanceOf[to] += amount;
        totalSupply += amount;

        emit Transfer(address(0), to, amount);
        emit Mint(to, amount);
    }

    function sellBack(uint256 quantity) external {
        require(quantity > 0, "Quantity must be > 0");
        uint256 amount = quantity * 10**decimals;
        require(balanceOf[msg.sender] >= amount, "Insufficient PTRAILX balance");

        balanceOf[msg.sender] -= amount;
        totalSupply -= amount;

        uint256 payout = (quantity * MINT_PRICE * SELLBACK_RATIO) / 100;
        require(IERC20(PTRAIL).transferFrom(owner, msg.sender, payout), "Payout failed");

        emit Transfer(msg.sender, address(0), amount);
        emit SellBack(msg.sender, amount);
    }

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

    function transferFrom(address from, address to, uint256 amount) external returns (bool) {
        require(allowance[from][msg.sender] >= amount, "Allowance exceeded");
        allowance[from][msg.sender] -= amount;
        return _transfer(from, to, amount);
    }

    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        require(balanceOf[from] >= amount, "Insufficient balance");
        balanceOf[from] -= amount;

        if (to == lpPair) {
            uint256 taxedAmount = (amount * DEX_SELL_TAX) / 100;
            uint256 sendAmount = amount - taxedAmount;

            balanceOf[to] += sendAmount;
            balanceOf[owner] += taxedAmount;

            emit Transfer(from, to, sendAmount);
            emit Transfer(from, owner, taxedAmount);
            emit DexSellTaxed(from, taxedAmount);
        } else {
            balanceOf[to] += amount;
            emit Transfer(from, to, amount);
        }

        return true;
    }

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

    function getAllowance(address _owner, address _spender) external view returns (uint256) {
        return allowance[_owner][_spender];
    }

    function setLP(address _lp) external onlyOwner {
        lpPair = _lp;
    }

    function setStakingContract(address _staking) external onlyOwner {
        stakingContract = _staking;
    }
}