Skip to content

Commit

Permalink
fix corrections
Browse files Browse the repository at this point in the history
  • Loading branch information
faytey committed Jul 3, 2024
1 parent 5c508ff commit 545c075
Show file tree
Hide file tree
Showing 6 changed files with 8,966 additions and 6,830 deletions.
13 changes: 0 additions & 13 deletions package-lock.json

This file was deleted.

16 changes: 16 additions & 0 deletions packages/contracts/src/MockResolver.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./PlayerHandle.sol";

contract MockENSResolver is IENSResolver {
mapping(bytes32 => string) public names;

function setName(bytes32 node, string memory name) public {
names[node] = name;
}

function name(bytes32 node) external view override returns (string memory) {
return names[node];
}
}
48 changes: 36 additions & 12 deletions packages/contracts/src/PlayerHandle.sol
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Ownable} from "openzeppelin/access/Ownable.sol";
import {Strings} from "openzeppelin/utils/Strings.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";

interface IENSResolver {
function getEnsName(address addr) external view returns (string memory);
function name(bytes32 node) external view returns (string memory);
}

error InvalidHandle();
error HandleAlreadyTaken();
error PlayerNotEligible();

contract PlayerHandle is Ownable {
using Strings for uint256;

Expand All @@ -25,9 +29,15 @@ contract PlayerHandle is Ownable {
}

function registerHandle(string memory handle) external {
require(checkHandleValidity(handle), "Invalid handle");
require(handleOwners[handle] == address(0), "Handle already taken");
require(checkPlayerEligibility(msg.sender), "Player not eligible");
if (!checkHandleValidity(handle)) {
revert InvalidHandle();
}
if (handleOwners[handle] != address(0)) {
revert HandleAlreadyTaken();
}
if (!checkPlayerEligibility(msg.sender)) {
revert PlayerNotEligible();
}

if (bytes(handles[msg.sender]).length > 0) {
handleOwners[handles[msg.sender]] = address(0);
Expand All @@ -40,8 +50,13 @@ contract PlayerHandle is Ownable {
}

function changeHandle(string memory newHandle) external {
require(checkHandleValidity(newHandle), "Invalid handle");
require(handleOwners[newHandle] == address(0), "Handle already taken");
if (!checkHandleValidity(newHandle)) {
revert InvalidHandle();
}

if (handleOwners[newHandle] != address(0)) {
revert HandleAlreadyTaken();
}

string memory oldHandle = handles[msg.sender];
handles[msg.sender] = newHandle;
Expand All @@ -58,7 +73,8 @@ contract PlayerHandle is Ownable {

function getPlayerHandle(address player) external view returns (string memory) {
if (useEns[player]) {
string memory ensName = ensResolver.getEnsName(player);
bytes32 node = keccak256(abi.encodePacked(addressToBytes32(player)));
string memory ensName = ensResolver.name(node);
if (bytes(ensName).length > 0) {
return ensName;
}
Expand All @@ -68,17 +84,25 @@ contract PlayerHandle is Ownable {

function checkHandleValidity(string memory handle) public pure returns (bool) {
bytes memory b = bytes(handle);
if (b.length < 5) return false;
if (b.length < 5 || b.length > 15) {
return false;
}
for (uint256 i; i < b.length; i++) {
bytes1 char = b[i];
if (char < 0x20 || char > 0x7E || char == 0x2E) {
if (!(char >= 0x30 && char <= 0x39) && // 0-9
!(char >= 0x41 && char <= 0x5A) && // A-Z
!(char >= 0x61 && char <= 0x7A)) { // a-z
return false;
}
}
return true;
}

function checkPlayerEligibility(address player) public pure returns (bool) {
return true;
return true; // Placeholder function; implement eligibility logic as needed
}

function addressToBytes32(address addr) private pure returns (bytes32) {
return bytes32(uint256(uint160(addr)));
}
}
2 changes: 2 additions & 0 deletions packages/contracts/src/deploy/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {InventoryCardsCollection} from "../InventoryCardsCollection.sol";
import {Groth16Verifier as DrawVerifier} from "../verifiers/DrawVerifier.sol";
import {Groth16Verifier as DrawHandVerifier} from "../verifiers/DrawHandVerifier.sol";
import {Groth16Verifier as PlayVerifier} from "../verifiers/PlayVerifier.sol";
import {MockENSResolver} from "../MockResolver.sol";
import {PlayerHandle} from "../PlayerHandle.sol";

import {Script, console2} from "forge-std/Script.sol";
// import {Multicall3} from "multicall/Multicall3.sol";
Expand Down
86 changes: 43 additions & 43 deletions packages/contracts/src/test/PlayerHandle.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,76 +3,76 @@ pragma solidity ^0.8.0;

import "forge-std/Test.sol";
import "../PlayerHandle.sol";
import {MockENSResolver} from "../MockResolver.sol";

contract MockENSResolver is IENSResolver {
mapping(address => string) private ensNames;

function setEnsName(address addr, string memory name) external {
ensNames[addr] = name;
}

function getEnsName(address addr) external view override returns (string memory) {
return ensNames[addr];
}
}

contract PlayerHandleTest is Test {
PlayerHandle public playerHandle;
MockENSResolver public mockEnsResolver;
MockENSResolver public mockENSResolver;

address player1 = address(0x1);
address player2 = address(0x2);
address public alice = address(0x1);
address public bob = address(0x2);

function setUp() public {
mockEnsResolver = new MockENSResolver();
playerHandle = new PlayerHandle(address(mockEnsResolver));
mockENSResolver = new MockENSResolver();
playerHandle = new PlayerHandle(address(mockENSResolver));
}

function testRegisterHandle() public {
vm.prank(player1);
playerHandle.registerHandle("player1");
vm.prank(alice);
playerHandle.registerHandle("AliceHandle");

assertEq(playerHandle.getPlayerHandle(alice), "AliceHandle");
}

string memory handle = playerHandle.getPlayerHandle(player1);
assertEq(handle, "player1");
function testRegisterInvalidHandle() public {
vm.prank(alice);
vm.expectRevert(abi.encodeWithSignature("InvalidHandle()"));
playerHandle.registerHandle("a");
}

function testHandleAlreadyTaken() public {
vm.prank(alice);
playerHandle.registerHandle("AliceHandle");

vm.prank(bob);
vm.expectRevert(abi.encodeWithSignature("HandleAlreadyTaken()"));
playerHandle.registerHandle("AliceHandle");
}

function testChangeHandle() public {
vm.prank(player1);
playerHandle.registerHandle("player1");
vm.prank(alice);
playerHandle.registerHandle("AliceHandle");

vm.prank(player1);
playerHandle.changeHandle("newPlayer1");
vm.prank(alice);
playerHandle.changeHandle("NewAliceHandle");

string memory handle = playerHandle.getPlayerHandle(player1);
assertEq(handle, "newPlayer1");
assertEq(playerHandle.getPlayerHandle(alice), "NewAliceHandle");
}

function testSetUseEns() public {
mockEnsResolver.setEnsName(player1, "player1.eth");
bytes32 node = keccak256(abi.encodePacked(addressToBytes32(alice)));
mockENSResolver.setName(node, "alice.eth");

vm.prank(player1);
vm.prank(alice);
playerHandle.setUseEns(true);

string memory handle = playerHandle.getPlayerHandle(player1);
assertEq(handle, "player1.eth");
assertEq(playerHandle.getPlayerHandle(alice), "alice.eth");
}

function testHandleValidity() public {
assertTrue(playerHandle.checkHandleValidity("validHandle"));
assertFalse(playerHandle.checkHandleValidity("inv"));
assertFalse(playerHandle.checkHandleValidity("invalid.handle"));
}
function testUnsetUseEns() public {
bytes32 node = keccak256(abi.encodePacked(addressToBytes32(alice)));
mockENSResolver.setName(node, "alice.eth");

function testHandleAlreadyTaken() public {
vm.prank(player1);
playerHandle.registerHandle("player1");
vm.prank(alice);
playerHandle.registerHandle("AliceHandle");
playerHandle.setUseEns(true);
playerHandle.setUseEns(false);

vm.prank(player2);
vm.expectRevert("Handle already taken");
playerHandle.registerHandle("player1");
assertEq(playerHandle.getPlayerHandle(alice), "AliceHandle");
}

function testPlayerEligibility() public {
assertTrue(playerHandle.checkPlayerEligibility(player1));
function addressToBytes32(address addr) private pure returns (bytes32) {
return bytes32(uint256(uint160(addr)));
}
}
Loading

0 comments on commit 545c075

Please sign in to comment.