// SPDX-License-Identifier: MIT pragma solidity ^0.8.30; // Eight bounded game/app statistics. Both editions enforce identical uint32 // limits through the public uint256 ABI. Only the storage field types differ. contract StatsRegistry { address public immutable owner; uint256 public constant MAX_STAT = type(uint32).max; struct Stats { uint32 experience; uint32 health; uint32 mana; uint32 stamina; uint32 strength; uint32 agility; uint32 intelligence; uint32 level; } mapping(address => Stats) private stats; event StatsChanged(address indexed player, uint256[8] values); constructor() { owner = msg.sender; } function setStats(address player, uint256[8] calldata values) external { require(msg.sender == owner, "Owner only"); writeStats(player, values); } function setMany(address[] calldata players, uint256[8][] calldata values) external { require(msg.sender == owner, "Owner only"); require(players.length > 0 && players.length <= 8, "Use 1 to 8 players"); require(players.length == values.length, "Length mismatch"); for (uint256 i = 0; i < players.length; i++) writeStats(players[i], values[i]); } function getStats(address player) external view returns (uint256[8] memory) { Stats storage s = stats[player]; return [uint256(s.experience), uint256(s.health), uint256(s.mana), uint256(s.stamina), uint256(s.strength), uint256(s.agility), uint256(s.intelligence), uint256(s.level)]; } function writeStats(address player, uint256[8] calldata values) private { require(player != address(0), "Player required"); for (uint256 i = 0; i < 8; i++) require(values[i] <= MAX_STAT, "Stat exceeds uint32"); stats[player] = Stats({experience: uint32(values[0]), health: uint32(values[1]), mana: uint32(values[2]), stamina: uint32(values[3]), strength: uint32(values[4]), agility: uint32(values[5]), intelligence: uint32(values[6]), level: uint32(values[7])}); emit StatsChanged(player, values); } }