MegaSalePM

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

address constant SALE = 0xaB02bf85a7a851b6A379eA3D5bD3B9b4f5Dd8461;
address constant PAMM = 0x000000000071176401AdA1f2CD7748e28E173FCa;

interface IPAMM {
    function createMarket(
        string calldata description,
        address resolver,
        uint72 close,
        bool canClose,
        uint256 seedYes,
        uint256 seedNo
    ) external returns (uint256 marketId, uint256 noId);

    function closeMarket(uint256 marketId) external;
    function resolve(uint256 marketId, bool outcome) external;
}

/// @notice Bet on MegaSale. Forever on Ethereum.
/// @dev Markets resolve early if threshold is met.
contract MegaSalePM {
    error Unknown();
    error Pending();

    mapping(uint256 marketId => Bet) public bets;

    struct Bet { uint64 amount; uint72 deadline; }
    
    function totalActiveBidAmount() public view returns (uint64) {
        return MegaSalePM(SALE).totalActiveBidAmount();
    }

    function closeAuctionAtTimestamp() public view returns (uint64) {
        return MegaSalePM(SALE).closeAuctionAtTimestamp();
    }

    function makeBet(uint64 amount, uint72 deadline, uint256 seedYes, uint256 seedNo) public returns (uint256 marketId, uint256 noId) {
        string memory description = string(
            abi.encodePacked(
                "MegaSale totalActiveBidAmount() >= ",
                _toString(amount),
                " USDT by ",
                _toString(deadline),
                " Unix epoch time. ",
                "Note: market may close early once threshold is reached."
            )
        );
        (marketId, noId) = IPAMM(PAMM).createMarket(description, address(this), deadline, true, seedYes, seedNo);
        bets[marketId] = Bet(amount, deadline);
    }

    function makeBetOnDeadline(uint64 amount, uint256 seedYes, uint256 seedNo) public returns (uint256 marketId, uint256 noId) {
        return makeBet(amount, uint72(closeAuctionAtTimestamp()), seedYes, seedNo);
    }

    function resolveBet(uint256 marketId) public {
        Bet memory b = bets[marketId];
        if (b.deadline == 0) revert Unknown();

        if (totalActiveBidAmount() >= b.amount) {
            if (block.timestamp < b.deadline) IPAMM(PAMM).closeMarket(marketId);
            IPAMM(PAMM).resolve(marketId, true);
            delete bets[marketId];
            return;
        }

        if (block.timestamp < b.deadline) revert Pending();
        IPAMM(PAMM).resolve(marketId, false);
        delete bets[marketId];
    }

    function _toString(uint256 value) internal pure returns (string memory result) {
        assembly ("memory-safe") {
            result := add(mload(0x40), 0x80)
            mstore(0x40, add(result, 0x20))
            mstore(result, 0)
            let end := result
            let w := not(0)
            for { let temp := value } 1 {} {
                result := add(result, w)
                mstore8(result, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }
            let n := sub(end, result)
            result := sub(result, 0x20)
            mstore(result, n)
        }
    }
}

Tags:
addr:0x14b782586a218c2f9f84b815308cc25fe0a7642f|verified:true|block:23681490|tx:0x9ecaebe1810a9b1d62938dfd4e09782d0d638f1c462cecf9d64a749296329804|first_check:1761732451

Submitted on: 2025-10-29 11:07:31

Comments

Log in to comment.

No comments yet.