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