Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ZCUAirHockey
- Optimization enabled
- true
- Compiler version
- v0.8.19+commit.7dd6d404
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2026-09-03T14:01:09.321532Z
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
/// @title ZCU Air Hockey — Proof-of-Play match ledger
/// @notice Matches are played in the browser; final results are recorded here
/// on the Zero Chill Units chain. First player to WIN_GOALS goals wins.
contract ZCUAirHockey {
struct Stats {
uint32 wins;
uint32 losses;
uint32 goalsFor;
uint32 goalsAgainst;
uint64 lastPlayed;
}
uint8 public constant WIN_GOALS = 5;
mapping(address => Stats) public stats;
mapping(address => string) public names;
mapping(address => bool) private known;
address[] public players;
uint256 public totalMatches;
event MatchPlayed(address indexed player, uint8 playerGoals, uint8 aiGoals, bool win, uint256 matchId);
event NameSet(address indexed player, string name);
function recordMatch(uint8 playerGoals, uint8 aiGoals) external {
require(playerGoals <= WIN_GOALS && aiGoals <= WIN_GOALS, "bad score");
require((playerGoals == WIN_GOALS) != (aiGoals == WIN_GOALS), "no winner");
if (!known[msg.sender]) {
known[msg.sender] = true;
players.push(msg.sender);
}
Stats storage s = stats[msg.sender];
bool win = playerGoals == WIN_GOALS;
if (win) { s.wins += 1; } else { s.losses += 1; }
s.goalsFor += playerGoals;
s.goalsAgainst += aiGoals;
s.lastPlayed = uint64(block.timestamp);
totalMatches += 1;
emit MatchPlayed(msg.sender, playerGoals, aiGoals, win, totalMatches);
}
function setName(string calldata name) external {
require(bytes(name).length <= 24, "name too long");
names[msg.sender] = name;
emit NameSet(msg.sender, name);
}
function playerCount() external view returns (uint256) {
return players.length;
}
}
Contract ABI
[{"type":"event","name":"MatchPlayed","inputs":[{"type":"address","name":"player","internalType":"address","indexed":true},{"type":"uint8","name":"playerGoals","internalType":"uint8","indexed":false},{"type":"uint8","name":"aiGoals","internalType":"uint8","indexed":false},{"type":"bool","name":"win","internalType":"bool","indexed":false},{"type":"uint256","name":"matchId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NameSet","inputs":[{"type":"address","name":"player","internalType":"address","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"WIN_GOALS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"names","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"playerCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"players","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recordMatch","inputs":[{"type":"uint8","name":"playerGoals","internalType":"uint8"},{"type":"uint8","name":"aiGoals","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setName","inputs":[{"type":"string","name":"name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"wins","internalType":"uint32"},{"type":"uint32","name":"losses","internalType":"uint32"},{"type":"uint32","name":"goalsFor","internalType":"uint32"},{"type":"uint32","name":"goalsAgainst","internalType":"uint32"},{"type":"uint64","name":"lastPlayed","internalType":"uint64"}],"name":"stats","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalMatches","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50610977806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638bcdcbf31161005b5780638bcdcbf3146100eb578063bc86ace514610186578063c47f00271461019b578063f71d96cb146101ae57600080fd5b806321379fdd1461008d5780632a5b1451146100ac578063302bcc57146100c35780635cf3d346146100cb575b600080fd5b610095600581565b60405160ff90911681526020015b60405180910390f35b6100b560045481565b6040519081526020016100a3565b6003546100b5565b6100de6100d936600461060d565b6101d9565b6040516100a3919061063d565b6101456100f936600461060d565b60006020819052908152604090205463ffffffff808216916401000000008104821691600160401b8204811691600160601b810490911690600160801b900467ffffffffffffffff1685565b6040805163ffffffff9687168152948616602086015292851692840192909252909216606082015267ffffffffffffffff909116608082015260a0016100a3565b6101996101943660046106a1565b610273565b005b6101996101a93660046106d4565b610540565b6101c16101bc366004610746565b6105e3565b6040516001600160a01b0390911681526020016100a3565b600160205260009081526040902080546101f29061075f565b80601f016020809104026020016040519081016040528092919081815260200182805461021e9061075f565b801561026b5780601f106102405761010080835404028352916020019161026b565b820191906000526020600020905b81548152906001019060200180831161024e57829003601f168201915b505050505081565b600560ff83161180159061028b5750600560ff821611155b6102c85760405162461bcd60e51b81526020600482015260096024820152686261642073636f726560b81b60448201526064015b60405180910390fd5b60ff8181166005908114918416140361030f5760405162461bcd60e51b81526020600482015260096024820152683737903bb4b73732b960b91b60448201526064016102bf565b3360009081526002602052604090205460ff1661038357336000818152600260205260408120805460ff191660019081179091556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191690911790555b33600090815260208190526040902060ff831660051480156103dd57815460019083906000906103ba90849063ffffffff166107af565b92506101000a81548163ffffffff021916908363ffffffff16021790555061041f565b81546001908390600490610400908490640100000000900463ffffffff166107af565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b815460ff8516908390600890610443908490600160401b900463ffffffff166107af565b92506101000a81548163ffffffff021916908363ffffffff1602179055508260ff1682600001600c8282829054906101000a900463ffffffff1661048791906107af565b92506101000a81548163ffffffff021916908363ffffffff160217905550428260000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008282546104e391906107d3565b90915550506004546040805160ff8781168252861660208201528315158183015260608101929092525133917fff9e9d923a095914d0f9a8745730fd9213154db695f3d85818c28cc9b1ded3fd919081900360800190a250505050565b60188111156105815760405162461bcd60e51b815260206004820152600d60248201526c6e616d6520746f6f206c6f6e6760981b60448201526064016102bf565b33600090815260016020526040902061059b828483610851565b50336001600160a01b03167fa4cea56cd77acc2291276688ddfb9e3144c5dc056ada99eed3cd0460fbeda17583836040516105d7929190610912565b60405180910390a25050565b600381815481106105f357600080fd5b6000918252602090912001546001600160a01b0316905081565b60006020828403121561061f57600080fd5b81356001600160a01b038116811461063657600080fd5b9392505050565b600060208083528351808285015260005b8181101561066a5785810183015185820160400152820161064e565b506000604082860101526040601f19601f8301168501019250505092915050565b803560ff8116811461069c57600080fd5b919050565b600080604083850312156106b457600080fd5b6106bd8361068b565b91506106cb6020840161068b565b90509250929050565b600080602083850312156106e757600080fd5b823567ffffffffffffffff808211156106ff57600080fd5b818501915085601f83011261071357600080fd5b81358181111561072257600080fd5b86602082850101111561073457600080fd5b60209290920196919550909350505050565b60006020828403121561075857600080fd5b5035919050565b600181811c9082168061077357607f821691505b60208210810361079357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8181168382160190808211156107cc576107cc610799565b5092915050565b808201808211156107e6576107e6610799565b92915050565b634e487b7160e01b600052604160045260246000fd5b601f82111561084c57600081815260208120601f850160051c810160208610156108295750805b601f850160051c820191505b8181101561084857828155600101610835565b5050505b505050565b67ffffffffffffffff831115610869576108696107ec565b61087d83610877835461075f565b83610802565b6000601f8411600181146108b157600085156108995750838201355b600019600387901b1c1916600186901b17835561090b565b600083815260209020601f19861690835b828110156108e257868501358255602094850194600190920191016108c2565b50868210156108ff5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea264697066735822122050dd23a96e51a2e9a66f5b3bf3c82e8893d5d8ee7c945f1865bb989d597f571264736f6c63430008130033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638bcdcbf31161005b5780638bcdcbf3146100eb578063bc86ace514610186578063c47f00271461019b578063f71d96cb146101ae57600080fd5b806321379fdd1461008d5780632a5b1451146100ac578063302bcc57146100c35780635cf3d346146100cb575b600080fd5b610095600581565b60405160ff90911681526020015b60405180910390f35b6100b560045481565b6040519081526020016100a3565b6003546100b5565b6100de6100d936600461060d565b6101d9565b6040516100a3919061063d565b6101456100f936600461060d565b60006020819052908152604090205463ffffffff808216916401000000008104821691600160401b8204811691600160601b810490911690600160801b900467ffffffffffffffff1685565b6040805163ffffffff9687168152948616602086015292851692840192909252909216606082015267ffffffffffffffff909116608082015260a0016100a3565b6101996101943660046106a1565b610273565b005b6101996101a93660046106d4565b610540565b6101c16101bc366004610746565b6105e3565b6040516001600160a01b0390911681526020016100a3565b600160205260009081526040902080546101f29061075f565b80601f016020809104026020016040519081016040528092919081815260200182805461021e9061075f565b801561026b5780601f106102405761010080835404028352916020019161026b565b820191906000526020600020905b81548152906001019060200180831161024e57829003601f168201915b505050505081565b600560ff83161180159061028b5750600560ff821611155b6102c85760405162461bcd60e51b81526020600482015260096024820152686261642073636f726560b81b60448201526064015b60405180910390fd5b60ff8181166005908114918416140361030f5760405162461bcd60e51b81526020600482015260096024820152683737903bb4b73732b960b91b60448201526064016102bf565b3360009081526002602052604090205460ff1661038357336000818152600260205260408120805460ff191660019081179091556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191690911790555b33600090815260208190526040902060ff831660051480156103dd57815460019083906000906103ba90849063ffffffff166107af565b92506101000a81548163ffffffff021916908363ffffffff16021790555061041f565b81546001908390600490610400908490640100000000900463ffffffff166107af565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b815460ff8516908390600890610443908490600160401b900463ffffffff166107af565b92506101000a81548163ffffffff021916908363ffffffff1602179055508260ff1682600001600c8282829054906101000a900463ffffffff1661048791906107af565b92506101000a81548163ffffffff021916908363ffffffff160217905550428260000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008282546104e391906107d3565b90915550506004546040805160ff8781168252861660208201528315158183015260608101929092525133917fff9e9d923a095914d0f9a8745730fd9213154db695f3d85818c28cc9b1ded3fd919081900360800190a250505050565b60188111156105815760405162461bcd60e51b815260206004820152600d60248201526c6e616d6520746f6f206c6f6e6760981b60448201526064016102bf565b33600090815260016020526040902061059b828483610851565b50336001600160a01b03167fa4cea56cd77acc2291276688ddfb9e3144c5dc056ada99eed3cd0460fbeda17583836040516105d7929190610912565b60405180910390a25050565b600381815481106105f357600080fd5b6000918252602090912001546001600160a01b0316905081565b60006020828403121561061f57600080fd5b81356001600160a01b038116811461063657600080fd5b9392505050565b600060208083528351808285015260005b8181101561066a5785810183015185820160400152820161064e565b506000604082860101526040601f19601f8301168501019250505092915050565b803560ff8116811461069c57600080fd5b919050565b600080604083850312156106b457600080fd5b6106bd8361068b565b91506106cb6020840161068b565b90509250929050565b600080602083850312156106e757600080fd5b823567ffffffffffffffff808211156106ff57600080fd5b818501915085601f83011261071357600080fd5b81358181111561072257600080fd5b86602082850101111561073457600080fd5b60209290920196919550909350505050565b60006020828403121561075857600080fd5b5035919050565b600181811c9082168061077357607f821691505b60208210810361079357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8181168382160190808211156107cc576107cc610799565b5092915050565b808201808211156107e6576107e6610799565b92915050565b634e487b7160e01b600052604160045260246000fd5b601f82111561084c57600081815260208120601f850160051c810160208610156108295750805b601f850160051c820191505b8181101561084857828155600101610835565b5050505b505050565b67ffffffffffffffff831115610869576108696107ec565b61087d83610877835461075f565b83610802565b6000601f8411600181146108b157600085156108995750838201355b600019600387901b1c1916600186901b17835561090b565b600083815260209020601f19861690835b828110156108e257868501358255602094850194600190920191016108c2565b50868210156108ff5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea264697066735822122050dd23a96e51a2e9a66f5b3bf3c82e8893d5d8ee7c945f1865bb989d597f571264736f6c63430008130033