// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; contract TicTacToe is ERC721 { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; struct Game { string nonce; address winner; } mapping(address => uint) public tallies; mapping(bytes => bool) public nonces; constructor() ERC721("TicTacToe", "TTT"){} function tally(address _sessionAddress, Game[] memory _games ) public returns (bool) { // increment counter uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); // check if nonce has been used before for(uint i; i< _games.length; i++){ if(!nonces[abi.encodePacked(_sessionAddress, _games[i].nonce)]){ nonces[abi.encodePacked(_sessionAddress, _games[i].nonce)] = true; if(_games[i].winner == _sessionAddress){ // tally count tallies[_sessionAddress] = tallies[_sessionAddress]+1; return true; } } else { revert("Nonce used"); } } } }
0.4.18