Skip to main content
PulseScanner.io

Address

0x2a4cacabf39ea12e2e64a6d1c2b2cbfa0c0b09c3
Current Holdings
$0.0116
TXs sent
not counted
First Active
2025-10-29
block 24,886,820
Last Active
323 days ago
block 24,886,902
Funded By
0x27e8…b919

Net worth historyi

2 snapshots · to block 27,480,473coverage change 26 Augcoverage change 27 Augcoverage change 27 Augcoverage change 27 Augcoverage change 27 Aug
exact matchPulseMarketsolc 0.8.24+commit.e11b9ed9runtime exact · creation exact
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract PulseMarket {
    address public immutable TREASURY;
    address public owner;
    uint256 public constant FEE_BPS = 200; // 2%

    bool private _locked;

    struct Market {
        string title;
        uint256 deadline; // unix seconds UTC
        bool resolved;
        bool outcome; // true = YES
        uint256 totalYes;
        uint256 totalNo;
    }

    Market[] public markets;
    mapping(uint256 => mapping(address => uint256)) public yesBets;
    mapping(uint256 => mapping(address => uint256)) public noBets;
    mapping(uint256 => mapping(address => bool)) public claimed;

    event MarketCreated(uint256 indexed id, string title, uint256 deadline);
    event BetPlaced(uint256 indexed id, address indexed user, bool yesBet, uint256 amount);
    event MarketResolved(uint256 indexed id, bool outcome);
    event Claimed(uint256 indexed id, address indexed user, uint256 payout);

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

    modifier nonReentrant() {
        require(!_locked, "reentrancy");
        _locked = true;
        _;
        _locked = false;
    }

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

        // Seed 10 PulseChain related markets with fixed UTC deadlines (2025)
        _create("Will PulseX 24h volume exceed 50M USD by Nov 30 2025", 1764547199);
        _create("Will PLS price be above $0.001 on Nov 30 2025",           1764547199);
        _create("Will LibertySwap 24h volume exceed 10M USD by Nov 20 2025", 1763596800);
        _create("Will any PulseChain token enter top 100 by Dec 31 2025",   1767225599);
        _create("Will an official PulseChain AMA be hosted by Nov 25 2025", 1764028800);
        _create("Will PulseChain daily active addresses exceed 150k by Dec 10 2025", 1765324800);
        _create("Will PulseX introduce v3 incentives by Dec 15 2025",       1765756800);
        _create("Will total PLS burned exceed 5B by Dec 20 2025",           1766188800);
        _create("Will x402 style bridge integration go live on PulseChain by Dec 25 2025", 1766620800);
        _create("Will Pump.tires list 2000+ tokens by Nov 15 2025",         1763164800);
    }

    function _create(string memory title, uint256 deadline) internal {
        require(deadline > block.timestamp, "past deadline");
        markets.push(Market(title, deadline, false, false, 0, 0));
        emit MarketCreated(markets.length - 1, title, deadline);
    }

    function marketsLength() external view returns (uint256) {
        return markets.length;
    }

    function placeBet(uint256 id, bool betYes) external payable nonReentrant {
        Market storage m = markets[id];
        require(block.timestamp < m.deadline, "closed");
        require(msg.value > 0, "zero value");

        uint256 fee = (msg.value * FEE_BPS) / 10_000;
        uint256 stake = msg.value - fee;

        (bool okTreasury, ) = TREASURY.call{value: fee}("");
        require(okTreasury, "treasury transfer failed");

        if (betYes) {
            yesBets[id][msg.sender] += stake;
            m.totalYes += stake;
        } else {
            noBets[id][msg.sender] += stake;
            m.totalNo += stake;
        }

        emit BetPlaced(id, msg.sender, betYes, stake);
    }

    function resolveMarket(uint256 id, bool winYes) external onlyOwner nonReentrant {
        Market storage m = markets[id];
        require(block.timestamp >= m.deadline, "deadline not reached");
        require(!m.resolved, "already");
        m.resolved = true;
        m.outcome = winYes;
        emit MarketResolved(id, winYes);
    }

    function claim(uint256 id) external nonReentrant {
        Market storage m = markets[id];
        require(m.resolved, "not resolved");
        require(!claimed[id][msg.sender], "claimed");

        uint256 userStake = m.outcome ? yesBets[id][msg.sender] : noBets[id][msg.sender];
        require(userStake > 0, "no winning bet");

        uint256 winners = m.outcome ? m.totalYes : m.totalNo;
        require(winners > 0, "no winners");

        uint256 pool = m.totalYes + m.totalNo;
        uint256 payout = (pool * userStake) / winners;

        claimed[id][msg.sender] = true;
        (bool ok, ) = msg.sender.call{value: payout}("");
        require(ok, "payout failed");

        emit Claimed(id, msg.sender, payout);
    }

    function sweepIfNoWinners(uint256 id) external onlyOwner nonReentrant {
        Market storage m = markets[id];
        require(m.resolved, "not resolved");
        uint256 winners = m.outcome ? m.totalYes : m.totalNo;
        require(winners == 0, "has winners");
        uint256 pool = m.totalYes + m.totalNo;
        m.totalYes = 0;
        m.totalNo = 0;
        (bool ok, ) = TREASURY.call{value: pool}("");
        require(ok, "sweep failed");
    }

    function transferOwnership(address n) external onlyOwner {
        require(n != address(0), "zero");
        owner = n;
    }

    receive() external payable {}
}