false
true
0

Contract Address Details

0x85c53CbfC7F3425f5328D05A6732f659F468592a

Contract Name
HandEval
Creator
0xfcafcc–9963aa at 0xd4d88b–aa17f2
Balance
0 tPLS
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
25348462
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
HandEval




Optimization enabled
false
Compiler version
v0.8.28+commit.7893614a




EVM Version




Verified at
2026-08-20T06:38:45.854281Z

Constructor Arguments


              

contracts/lib/HandEval.sol

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

/// @title HandEval — 7-card Texas Hold'em evaluator
/// @notice Mirrors web/js/handeval.mjs exactly (cross-checked by shared and
///         randomized differential test vectors).
/// @dev Card index k = 13*suit + rank; rank 0='2' … 12='A'.
///      Score: uint32 = category << 20 | five 4-bit tiebreak nibbles.
///      Categories: 0 high, 1 pair, 2 two pair, 3 trips, 4 straight,
///      5 flush, 6 full house, 7 quads, 8 straight flush.
library HandEval {
    /// @notice Evaluate 7 distinct cards; larger score = better hand.
    function evaluate7(uint8[7] memory cards) public pure returns (uint32) {
        uint8[13] memory rankCount;
        uint8[4] memory suitCount;
        uint16[4] memory suitMask;
        uint16 rankMask;
        for (uint256 i = 0; i < 7; i++) {
            uint8 k = cards[i];
            require(k < 52, "bad card");
            uint8 r = k % 13;
            uint8 s = k / 13;
            rankCount[r]++;
            suitCount[s]++;
            suitMask[s] |= uint16(1) << r;
            rankMask |= uint16(1) << r;
        }

        // straight flush
        for (uint256 s = 0; s < 4; s++) {
            if (suitCount[s] >= 5) {
                int8 t = straightTop(suitMask[s]);
                if (t >= 0) return score(8, uint8(t), 0, 0, 0, 0);
            }
        }

        // rank groups (descending scan)
        int8 quad = -1;
        int8 trip = -1;
        int8 trip2 = -1;
        int8 pairHi = -1;
        int8 pairLo = -1;
        for (int8 r = 12; r >= 0; r--) {
            uint8 c = rankCount[uint8(r)];
            if (c == 4) quad = r;
            else if (c == 3) {
                if (trip < 0) trip = r;
                else if (trip2 < 0) trip2 = r;
            } else if (c == 2) {
                if (pairHi < 0) pairHi = r;
                else if (pairLo < 0) pairLo = r;
            }
        }

        if (quad >= 0) {
            uint16 rest = rankMask & ~(uint16(1) << uint8(quad));
            return score(7, uint8(quad), top1(rest), 0, 0, 0);
        }
        if (trip >= 0 && (trip2 >= 0 || pairHi >= 0)) {
            uint8 pr = trip2 >= 0 ? uint8(trip2) : uint8(pairHi);
            return score(6, uint8(trip), pr, 0, 0, 0);
        }
        for (uint256 s = 0; s < 4; s++) {
            if (suitCount[s] >= 5) {
                (uint8 a, uint8 b, uint8 c, uint8 d, uint8 e) = top5(suitMask[s]);
                return score(5, a, b, c, d, e);
            }
        }
        {
            int8 t = straightTop(rankMask);
            if (t >= 0) return score(4, uint8(t), 0, 0, 0, 0);
        }
        if (trip >= 0) {
            uint16 rest = rankMask & ~(uint16(1) << uint8(trip));
            (uint8 k1, uint8 k2) = top2(rest);
            return score(3, uint8(trip), k1, k2, 0, 0);
        }
        if (pairHi >= 0 && pairLo >= 0) {
            uint16 rest = rankMask & ~(uint16(1) << uint8(pairHi)) & ~(uint16(1) << uint8(pairLo));
            return score(2, uint8(pairHi), uint8(pairLo), top1(rest), 0, 0);
        }
        if (pairHi >= 0) {
            uint16 rest = rankMask & ~(uint16(1) << uint8(pairHi));
            (uint8 k1, uint8 k2) = top2(rest);
            uint8 k3 = top1(rest & ~(uint16(1) << k1) & ~(uint16(1) << k2));
            return score(1, uint8(pairHi), k1, k2, k3, 0);
        }
        (uint8 h1, uint8 h2, uint8 h3, uint8 h4, uint8 h5) = top5(rankMask);
        return score(0, h1, h2, h3, h4, h5);
    }

    /// @dev Highest straight top-rank in a 13-bit mask, or -1. Wheel top = 3.
    function straightTop(uint16 mask) internal pure returns (int8) {
        for (int8 t = 12; t >= 4; t--) {
            uint16 need = uint16(0x1f) << uint8(t - 4);
            if (mask & need == need) return t;
        }
        // wheel A-2-3-4-5: bits 12,0,1,2,3
        if (mask & 0x100f == 0x100f) return 3;
        return -1;
    }

    function score(uint8 cat, uint8 n1, uint8 n2, uint8 n3, uint8 n4, uint8 n5)
        private pure returns (uint32)
    {
        return (uint32(cat) << 20) | (uint32(n1) << 16) | (uint32(n2) << 12)
            | (uint32(n3) << 8) | (uint32(n4) << 4) | uint32(n5);
    }

    function top1(uint16 mask) private pure returns (uint8) {
        for (int8 r = 12; r >= 0; r--) {
            if (mask & (uint16(1) << uint8(r)) != 0) return uint8(r);
        }
        return 0;
    }

    function top2(uint16 mask) private pure returns (uint8, uint8) {
        uint8 a = top1(mask);
        uint8 b = top1(mask & ~(uint16(1) << a));
        return (a, b);
    }

    function top5(uint16 mask) private pure returns (uint8, uint8, uint8, uint8, uint8) {
        uint8[5] memory o;
        uint256 n = 0;
        for (int8 r = 12; r >= 0 && n < 5; r--) {
            if (mask & (uint16(1) << uint8(r)) != 0) {
                o[n++] = uint8(r);
            }
        }
        return (o[0], o[1], o[2], o[3], o[4]);
    }
}
        

Compiler Settings

{"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":1,"enabled":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"function","stateMutability":"pure","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"evaluate7","inputs":[{"type":"uint8[7]","name":"cards","internalType":"uint8[7]"}]}]
              

Contract Creation Code

0x60808060405234601957610829908161001f823930815050f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c638573a3021461002757600080fd5b60e036600319011261008e57366023121561008e5761004660e0610093565b803660e41161008e576004905b60e4821061007457602061006684610140565b63ffffffff60405191168152f35b813560ff8116810361008e57815260209182019101610053565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176100b857604052565b634e487b7160e01b600052604160045260246000fd5b90600d8110156100df5760051b0190565b634e487b7160e01b600052603260045260246000fd5b60ff1660ff81146101065760010190565b634e487b7160e01b600052601160045260246000fd5b9060048110156100df5760051b0190565b60000b607f198114610106576000190190565b906101a09161014e83610093565b9236843760809061015e82610093565b918036843761016c81610093565b90368237600091825b60078410156102435760ff8460051b8301511660348110156102135760019161ffff8360ff600d8181870616958d836101c3896101bd836101b683876100ce565b51166100f5565b936100ce565b911690520416936101d960ff6101b6878d61011c565b60ff6101e5878d61011c565b911690521b16918261020661ffff6101fd848a61011c565b5116928861011c565b9117905217930192610175565b60405162461bcd60e51b81526020600482015260086024820152671898590818d85c9960c21b6044820152606490fd5b94959250509160005b6004811061060c57506000199283918491858095600c905b600082810b1215610559575050600081810b121561052d5750600084810b1215928380610513575b6104d1575060005b60048110610453575050506102a88561066c565b600081810b121561043a57506103f35750600082810b12159081806103e6575b6103965750610313575060ff610ff061ff0062ff00006102eb620ff0009561070a565b600099949693979298919950169760041b169560081b1693600c1b169160101b161717171790565b9060ff82166001901b61ffff16191661ffff8116610330906107ce565b92909160ff84166001901b61ffff16199060ff84166001901b61ffff16191661ffff161661ffff1661ffff16610365906106ce565b60041b610ff0169260081b61ff001691600c1b620ff000169060101b62ff00001662ff000016171762100000171790565b91905062ff000080620ff0008061ff006103d061ffff80622000009a81600160ff8d161b16199082600160ff8d161b1619161616166106ce565b60081b1695600c1b16169260101b161617171790565b50600081810b12156102c8565b905061ff00915062ff000080620ff00061041f61ffff623000009781600160ff89161b161916166107ce565b60009691965060081b1694600c1b169260101b161617171790565b6240000060109190911b62ff0000161795945050505050565b600560ff610461838661011c565b5116101561047157600101610294565b620ff000975060ff9650625000009550610ff0945061ff00935062ff000092506104a161ffff916104a89361011c565b511661070a565b60009a949693979299919a50169860041b169660081b1693600c1b169160101b16171717171790565b626000009750939562ff000095508594620ff000945092509050600082810b12610509575060ff165b600c1b169260101b1616171790565b905060ff166104fa565b50600081810b12158061028c5750600087810b121561028c565b9550505050505062ff000080620ff0006104fa61ffff627000009681600160ff89161b161916166106ce565b909160ff610569818516846100ce565b51166004810361058457505061057e8261012d565b90610264565b92969092600381036105c35750600081810b12156105a6575061057e8661012d565b95600086810b126105bb575b61057e9061012d565b9450846105b2565b9096906002146105d65761057e9061012d565b97600081810b12156105ef575061057e885b90506105b2565b97600088810b12610604575b61057e906105e8565b9650866105fb565b600560ff61061a838561011c565b5116101561062b575b60010161024c565b61064261ffff61063b838761011c565b511661066c565b600081810b12156106535750610623565b6280000060109190911b62ff0000161795945050505050565b600c5b8060000b600481126106b65760031901607f198112607f8213176101065760ff601f91161b61ffff80821691841616146106b1576106ac9061012d565b61066f565b905090565b505061100f809116146106c95760001990565b600390565b600c5b600081810b12156106e3575050600090565b61ffff600160ff83161b831616610702576106fd9061012d565b6106d1565b905060ff1690565b9060a09161071783610093565b92368437600092600c5b600081810b1215806107c4575b156107915760ff811661ffff6001821b851616610755575b506107509061012d565b610721565b85600019811461010657600101956000600582101561077d575060051b830152610750610746565b634e487b7160e01b81526032600452602490fd5b5092505060ff8251169160ff6020820151169260ff6040830151169260ff60808160608601511694015116919493929190565b506005851061072e565b906107f061ffff6107de846106ce565b9381600160ff87161b161916166106ce565b9056fea26469706673582212207d56530d1d4d143ad16cfdac291c058ce9ecfc5af08cedf0bb81523758314d5a64736f6c634300081c0033

Deployed ByteCode

0x6080604052600436101561001257600080fd5b60003560e01c638573a3021461002757600080fd5b60e036600319011261008e57366023121561008e5761004660e0610093565b803660e41161008e576004905b60e4821061007457602061006684610140565b63ffffffff60405191168152f35b813560ff8116810361008e57815260209182019101610053565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176100b857604052565b634e487b7160e01b600052604160045260246000fd5b90600d8110156100df5760051b0190565b634e487b7160e01b600052603260045260246000fd5b60ff1660ff81146101065760010190565b634e487b7160e01b600052601160045260246000fd5b9060048110156100df5760051b0190565b60000b607f198114610106576000190190565b906101a09161014e83610093565b9236843760809061015e82610093565b918036843761016c81610093565b90368237600091825b60078410156102435760ff8460051b8301511660348110156102135760019161ffff8360ff600d8181870616958d836101c3896101bd836101b683876100ce565b51166100f5565b936100ce565b911690520416936101d960ff6101b6878d61011c565b60ff6101e5878d61011c565b911690521b16918261020661ffff6101fd848a61011c565b5116928861011c565b9117905217930192610175565b60405162461bcd60e51b81526020600482015260086024820152671898590818d85c9960c21b6044820152606490fd5b94959250509160005b6004811061060c57506000199283918491858095600c905b600082810b1215610559575050600081810b121561052d5750600084810b1215928380610513575b6104d1575060005b60048110610453575050506102a88561066c565b600081810b121561043a57506103f35750600082810b12159081806103e6575b6103965750610313575060ff610ff061ff0062ff00006102eb620ff0009561070a565b600099949693979298919950169760041b169560081b1693600c1b169160101b161717171790565b9060ff82166001901b61ffff16191661ffff8116610330906107ce565b92909160ff84166001901b61ffff16199060ff84166001901b61ffff16191661ffff161661ffff1661ffff16610365906106ce565b60041b610ff0169260081b61ff001691600c1b620ff000169060101b62ff00001662ff000016171762100000171790565b91905062ff000080620ff0008061ff006103d061ffff80622000009a81600160ff8d161b16199082600160ff8d161b1619161616166106ce565b60081b1695600c1b16169260101b161617171790565b50600081810b12156102c8565b905061ff00915062ff000080620ff00061041f61ffff623000009781600160ff89161b161916166107ce565b60009691965060081b1694600c1b169260101b161617171790565b6240000060109190911b62ff0000161795945050505050565b600560ff610461838661011c565b5116101561047157600101610294565b620ff000975060ff9650625000009550610ff0945061ff00935062ff000092506104a161ffff916104a89361011c565b511661070a565b60009a949693979299919a50169860041b169660081b1693600c1b169160101b16171717171790565b626000009750939562ff000095508594620ff000945092509050600082810b12610509575060ff165b600c1b169260101b1616171790565b905060ff166104fa565b50600081810b12158061028c5750600087810b121561028c565b9550505050505062ff000080620ff0006104fa61ffff627000009681600160ff89161b161916166106ce565b909160ff610569818516846100ce565b51166004810361058457505061057e8261012d565b90610264565b92969092600381036105c35750600081810b12156105a6575061057e8661012d565b95600086810b126105bb575b61057e9061012d565b9450846105b2565b9096906002146105d65761057e9061012d565b97600081810b12156105ef575061057e885b90506105b2565b97600088810b12610604575b61057e906105e8565b9650866105fb565b600560ff61061a838561011c565b5116101561062b575b60010161024c565b61064261ffff61063b838761011c565b511661066c565b600081810b12156106535750610623565b6280000060109190911b62ff0000161795945050505050565b600c5b8060000b600481126106b65760031901607f198112607f8213176101065760ff601f91161b61ffff80821691841616146106b1576106ac9061012d565b61066f565b905090565b505061100f809116146106c95760001990565b600390565b600c5b600081810b12156106e3575050600090565b61ffff600160ff83161b831616610702576106fd9061012d565b6106d1565b905060ff1690565b9060a09161071783610093565b92368437600092600c5b600081810b1215806107c4575b156107915760ff811661ffff6001821b851616610755575b506107509061012d565b610721565b85600019811461010657600101956000600582101561077d575060051b830152610750610746565b634e487b7160e01b81526032600452602490fd5b5092505060ff8251169160ff6020820151169260ff6040830151169260ff60808160608601511694015116919493929190565b506005851061072e565b906107f061ffff6107de846106ce565b9381600160ff87161b161916166106ce565b9056fea26469706673582212207d56530d1d4d143ad16cfdac291c058ce9ecfc5af08cedf0bb81523758314d5a64736f6c634300081c0033