Skip to content

Commit

Permalink
cherry picked from signature workflow shortstrings for dist names
Browse files Browse the repository at this point in the history
  • Loading branch information
peersky committed Jan 15, 2025
1 parent f5c1790 commit c3747d9
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 71 deletions.
5 changes: 5 additions & 0 deletions .changeset/eighty-pandas-know.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'rankify-contracts': minor
---

added eip712 domain name and version returns
25 changes: 12 additions & 13 deletions deploy/mao.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ import { CodeIndex } from '@peeramid-labs/eds/types';
import CodeIndexAbi from '@peeramid-labs/eds/abi/src/CodeIndex.sol/CodeIndex.json';
import { MintSettingsStruct } from '../types/src/tokens/DistributableGovernanceERC20.sol/DistributableGovernanceERC20';
import { ArguableVotingTournament } from '../types/src/distributions/ArguableVotingTournament';
import { RInstance_MIN_PLAYERS } from '../playbook/utils';
import {
RANKIFY_INSTANCE_CONTRACT_NAME,
RANKIFY_INSTANCE_CONTRACT_VERSION,
RInstance_MIN_PLAYERS,
} from '../test/utils';

const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
const { deployments, getNamedAccounts } = hre;
Expand All @@ -19,11 +23,12 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
)) as CodeIndex;

let _trustedForwarder = ethers.constants.AddressZero;
let _distributionName = ethers.utils.formatBytes32String('MAO');
let _distributionName = process.env.MAO_INSTANCE_NAME ?? RANKIFY_INSTANCE_CONTRACT_NAME;
const versionString = process.env.MAO_INSTANCE_VERSION ?? RANKIFY_INSTANCE_CONTRACT_VERSION;
let _distributionVersion: LibSemver.VersionStruct = {
major: 0,
minor: 1,
patch: 0,
major: versionString.split('.')[0],
minor: versionString.split('.')[1],
patch: versionString.split('.')[2],
};

const log = (message: string) => {
Expand Down Expand Up @@ -79,12 +84,6 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
const initializerAdr = initializerDeployment.address;
const initializerSelector = '0x00000000';

const distributionName = ethers.utils.formatBytes32String('ArguableVotingTournament');
const version = {
major: 1,
minor: 0,
patch: 0,
};
const loupeFacetDeployment = await deploy('DiamondLoupeFacet', {
from: deployer,
skipIfAlreadyDeployed: true,
Expand Down Expand Up @@ -130,7 +129,7 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
gasLimit: 8000000,
estimatedGasLimit: 8000000,
skipIfAlreadyDeployed: true,
args: [initializerAdr, initializerSelector, distributionName, version, addresses],
args: [initializerAdr, initializerSelector, _distributionName, _distributionVersion, addresses],
});

log('Deploying ArguableVotingTournament...');
Expand Down Expand Up @@ -185,7 +184,7 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
arguableVotingTournamentCodeId,
accessManagerId,
govTokenDeploymentCodeId,
_distributionName,
_distributionName, // These could be other, currently duplicates with dependency, good as long as not used
_distributionVersion,
RInstance_MIN_PLAYERS,
],
Expand Down
26 changes: 16 additions & 10 deletions src/distributions/ArguableVotingTournament.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import "../facets/RankifyInstanceGameMastersFacet.sol";
import "../initializers/RankifyInstanceInit.sol";
import "../vendor/diamond/interfaces/IDiamondCut.sol";
import "@peeramid-labs/eds/src/libraries/LibSemver.sol";
import {ShortStrings, ShortString} from "@openzeppelin/contracts/utils/ShortStrings.sol";

/**
* @title ArguableVotingTournament Distribution
Expand All @@ -22,6 +23,7 @@ import "@peeramid-labs/eds/src/libraries/LibSemver.sol";
* @author Peeramid Labs, 2024
*/
contract ArguableVotingTournament is InitializedDiamondDistribution {
using ShortStrings for ShortString;
DiamondLoupeFacet private immutable _loupeFacet;
EIP712InspectorFacet private immutable _inspectorFacet;
RankifyInstanceMainFacet private immutable _RankifyMainFacet;
Expand All @@ -30,7 +32,7 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {
OwnershipFacet private immutable _OwnershipFacet;
address private immutable _initializer;

bytes32 private immutable distributionName;
ShortString private immutable distributionName;
uint256 private immutable distributionVersion;

/**
Expand All @@ -57,6 +59,7 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {

/**
* @dev Constructor for the ArguableVotingTournament contract
* @dev WARNING: distributionName must be less then 31 bytes long to comply with ShortStrings immutable format
* @notice Sets up the diamond proxy system with all required facets and initializes core components
* @dev The initializer function is added as a regular facet to the Diamond Proxy.
* Since initialization is handled by the distributor contract, it's expected that
Expand All @@ -65,7 +68,7 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {
constructor(
address initializer,
bytes4 initializerSelector,
bytes32 _distributionName,
string memory _distributionName,
LibSemver.Version memory version,
ArguableTournamentAddresses memory addresses
) InitializedDiamondDistribution(address(this), bytes32(0), initializerSelector) {
Expand All @@ -77,7 +80,8 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {
_RankifyGMFacet = RankifyInstanceGameMastersFacet(addresses.RankifyGMFacet);
_OwnershipFacet = OwnershipFacet(addresses.OwnershipFacet);

distributionName = _distributionName;
distributionName = ShortStrings.toShortString(_distributionName);
// console.log(LibSemver.toString())
distributionVersion = LibSemver.toUint256(version);
}

Expand Down Expand Up @@ -113,7 +117,7 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {
action: IDiamondCut.FacetCutAction.Add,
functionSelectors: EIP712InspectorFacetSelectors
});
bytes4[] memory RankifyInstanceMainFacetSelectors = new bytes4[](31);
bytes4[] memory RankifyInstanceMainFacetSelectors = new bytes4[](29);
RankifyInstanceMainFacetSelectors[0] = RankifyInstanceMainFacet.cancelGame.selector;
RankifyInstanceMainFacetSelectors[1] = RankifyInstanceMainFacet.gameCreator.selector;
RankifyInstanceMainFacetSelectors[2] = RankifyInstanceMainFacet.createGame.selector;
Expand Down Expand Up @@ -142,22 +146,24 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {
RankifyInstanceMainFacetSelectors[25] = RankifyInstanceMainFacet.getPlayersMoved.selector;
RankifyInstanceMainFacetSelectors[26] = RankifyInstanceMainFacet.estimateGamePrice.selector;
RankifyInstanceMainFacetSelectors[27] = RankifyInstanceMainFacet.isActive.selector;
RankifyInstanceMainFacetSelectors[28] = RankifyInstanceMainFacet.getGameState.selector;
RankifyInstanceMainFacetSelectors[29] = RankifyInstanceMainFacet.getCommonParams.selector;
RankifyInstanceMainFacetSelectors[30] = RankifyInstanceMainFacet.exitRankToken.selector;
// RankifyInstanceMainFacetSelectors[28] = RankifyInstanceMainFacet.getGameState.selector;
// RankifyInstanceMainFacetSelectors[29] = RankifyInstanceMainFacet.getCommonParams.selector;
RankifyInstanceMainFacetSelectors[28] = RankifyInstanceMainFacet.exitRankToken.selector;

facetCuts[2] = IDiamondCut.FacetCut({
facetAddress: address(_RankifyMainFacet),
action: IDiamondCut.FacetCutAction.Add,
functionSelectors: RankifyInstanceMainFacetSelectors
});

bytes4[] memory RankifyInstanceRequirementsFacetSelectors = new bytes4[](3);
bytes4[] memory RankifyInstanceRequirementsFacetSelectors = new bytes4[](5);
RankifyInstanceRequirementsFacetSelectors[0] = RankifyInstanceRequirementsFacet.setJoinRequirements.selector;
RankifyInstanceRequirementsFacetSelectors[1] = RankifyInstanceRequirementsFacet.getJoinRequirements.selector;
RankifyInstanceRequirementsFacetSelectors[2] = RankifyInstanceRequirementsFacet
.getJoinRequirementsByToken
.selector;
RankifyInstanceRequirementsFacetSelectors[3] = RankifyInstanceRequirementsFacet.getGameState.selector;
RankifyInstanceRequirementsFacetSelectors[4] = RankifyInstanceRequirementsFacet.getCommonParams.selector;

facetCuts[3] = IDiamondCut.FacetCut({
facetAddress: address(_RankifyReqsFacet),
Expand Down Expand Up @@ -206,7 +212,7 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {
//renouncing ownership
OwnershipFacet(diamond).transferOwnership(address(0));

return (returnValue, distributionName, distributionVersion);
return (returnValue, ShortString.unwrap(distributionName), distributionVersion);
}

function contractURI() public pure virtual override returns (string memory) {
Expand All @@ -215,6 +221,6 @@ contract ArguableVotingTournament is InitializedDiamondDistribution {

function sources() internal view virtual override returns (address[] memory, bytes32, uint256) {
(address[] memory srcs, , ) = super.sources();
return (srcs, distributionName, distributionVersion);
return (srcs, ShortString.unwrap(distributionName), distributionVersion);
}
}
16 changes: 9 additions & 7 deletions src/distributions/MAODistribution.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165C
import "@peeramid-labs/eds/src/abstracts/CodeIndexer.sol";
import "hardhat/console.sol";
import {TokenSettings} from "../vendor/aragon/interfaces.sol";

import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {ShortStrings, ShortString} from "@openzeppelin/contracts/utils/ShortStrings.sol";
/**
* @title MAODistribution
* @dev This contract implements the IDistribution and CodeIndexer interfaces. It uses the Clones library for address cloning.
Expand Down Expand Up @@ -42,7 +43,7 @@ contract MAODistribution is IDistribution, CodeIndexer {

using Clones for address;
address private immutable _trustedForwarder;
bytes32 private immutable _distributionName;
ShortString private immutable _distributionName;
uint256 private immutable _distributionVersion;
address private immutable _rankTokenBase;
IDistribution private immutable _RankifyDistributionBase;
Expand All @@ -56,6 +57,7 @@ contract MAODistribution is IDistribution, CodeIndexer {
* @notice Initializes the contract with the provided parameters and performs necessary checks.
* @dev Retrieves contract addresses from a contract index using the provided identifiers
* and initializes the distribution system.
* @dev WARNING: distributionName must be less then 31 bytes long to comply with ShortStrings immutable format
* @param trustedForwarder Address of the trusted forwarder for meta-transactions (WARNING: Not yet reviewed)
* @param paymentToken Address of the token used for payments in the system
* @param beneficiary Address that receives payments and fees
Expand All @@ -75,15 +77,15 @@ contract MAODistribution is IDistribution, CodeIndexer {
bytes32 RankifyDIistributionId,
bytes32 accessManagerId,
bytes32 governanceERC20BaseId,
bytes32 distributionName,
string memory distributionName,
LibSemver.Version memory distributionVersion,
uint256 minParticipantsInCircle
) {
require(minParticipantsInCircle > 2, "minParticipantsInCircle must be greater than 2");
_minParticipantsInCircle = minParticipantsInCircle;

_trustedForwarder = trustedForwarder;
_distributionName = distributionName;
_distributionName = ShortStrings.toShortString(distributionName);
_distributionVersion = LibSemver.toUint256(distributionVersion);
_rankTokenBase = getContractsIndex().get(rankTokenCodeId);
_governanceERC20Base = getContractsIndex().get(governanceERC20BaseId);
Expand Down Expand Up @@ -208,7 +210,7 @@ contract MAODistribution is IDistribution, CodeIndexer {
});

RankifyInstanceInit(RankifyDistrAddresses[0]).init(
string(abi.encodePacked(RankifyDistributionName)),
ShortStrings.toString(ShortString.wrap(RankifyDistributionName)),
LibSemver.toString(LibSemver.parse(RankifyDistributionVersion)),
RankifyInit
);
Expand Down Expand Up @@ -246,7 +248,7 @@ contract MAODistribution is IDistribution, CodeIndexer {
for (uint256 i; i < RankifyInstances.length; ++i) {
returnValue[tokenInstances.length + i] = RankifyInstances[i];
}
return (returnValue, _distributionName, _distributionVersion);
return (returnValue, ShortString.unwrap(_distributionName), _distributionVersion);
}

function contractURI() public pure virtual override returns (string memory) {
Expand All @@ -260,7 +262,7 @@ contract MAODistribution is IDistribution, CodeIndexer {
srcs[2] = address(_RankifyDistributionBase);
srcs[3] = address(_governanceERC20Base);
srcs[4] = address(_accessManagerBase);
return (srcs, _distributionName, _distributionVersion);
return (srcs, ShortString.unwrap(_distributionName), _distributionVersion);
}

/**
Expand Down
35 changes: 0 additions & 35 deletions src/facets/RankifyInstanceMainFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -388,41 +388,6 @@ contract RankifyInstanceMainFacet is
return gameId.isActive(player);
}

function getGameState(uint256 gameId) public view returns (IRankifyInstance.GameStateOutput memory state) {
LibTBG.Instance storage tbgInstanceState = LibTBG._getInstance(gameId);
LibRankify.GameState storage gameState = gameId.getGameState();
state = IRankifyInstance.GameStateOutput({
rank: gameState.rank,
minGameTime: gameState.minGameTime,
createdBy: gameState.createdBy,
numOngoingProposals: gameState.numOngoingProposals,
numPrevProposals: gameState.numPrevProposals,
numCommitments: gameState.numCommitments,
numVotesThisTurn: gameState.numVotesThisTurn,
numVotesPrevTurn: gameState.numVotesPrevTurn,
voting: gameState.voting,
currentTurn: tbgInstanceState.state.currentTurn,
turnStartedAt: tbgInstanceState.state.turnStartedAt,
registrationOpenAt: tbgInstanceState.state.registrationOpenAt,
startedAt: tbgInstanceState.state.startedAt,
hasStarted: tbgInstanceState.state.hasStarted,
hasEnded: tbgInstanceState.state.hasEnded,
numPlayersMadeMove: tbgInstanceState.state.numPlayersMadeMove,
numActivePlayers: tbgInstanceState.state.numActivePlayers,
isOvertime: tbgInstanceState.state.isOvertime,
timePerTurn: tbgInstanceState.settings.timePerTurn,
maxPlayerCnt: tbgInstanceState.settings.maxPlayerCnt,
minPlayerCnt: tbgInstanceState.settings.minPlayerCnt,
timeToJoin: tbgInstanceState.settings.timeToJoin,
maxTurns: tbgInstanceState.settings.maxTurns,
voteCredits: tbgInstanceState.settings.voteCredits,
gameMaster: tbgInstanceState.settings.gameMaster
});
}

function getCommonParams() public view returns (LibRankify.CommonParams memory) {
return LibRankify.instanceState().commonParams;
}

function exitRankToken(uint256 rankId, uint256 amount) external {
require(amount != 0, "cannot specify zero exit amount");
Expand Down
38 changes: 37 additions & 1 deletion src/facets/RankifyInstanceRequirementsFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {LibTBG} from "../libraries/LibTurnBasedGame.sol";
import {LibCoinVending} from "../libraries/LibCoinVending.sol";
import {LibRankify} from "../libraries/LibRankify.sol";

import {IRankifyInstance} from "../interfaces/IRankifyInstance.sol";
/**
* @title RankifyInstanceRequirementsFacet
* @notice Facet handling game requirements and conditions for Rankify instances
Expand Down Expand Up @@ -58,4 +58,40 @@ contract RankifyInstanceRequirementsFacet {
) public view returns (LibCoinVending.ContractCondition memory) {
return LibCoinVending.getPositionByContract(bytes32(gameId), contractAddress, contractId, contractType);
}

function getCommonParams() public view returns (LibRankify.CommonParams memory) {
return LibRankify.instanceState().commonParams;
}

function getGameState(uint256 gameId) public view returns (IRankifyInstance.GameStateOutput memory state) {
LibTBG.Instance storage tbgInstanceState = LibTBG._getInstance(gameId);
LibRankify.GameState storage gameState = gameId.getGameState();
state = IRankifyInstance.GameStateOutput({
rank: gameState.rank,
minGameTime: gameState.minGameTime,
createdBy: gameState.createdBy,
numOngoingProposals: gameState.numOngoingProposals,
numPrevProposals: gameState.numPrevProposals,
numCommitments: gameState.numCommitments,
numVotesThisTurn: gameState.numVotesThisTurn,
numVotesPrevTurn: gameState.numVotesPrevTurn,
voting: gameState.voting,
currentTurn: tbgInstanceState.state.currentTurn,
turnStartedAt: tbgInstanceState.state.turnStartedAt,
registrationOpenAt: tbgInstanceState.state.registrationOpenAt,
startedAt: tbgInstanceState.state.startedAt,
hasStarted: tbgInstanceState.state.hasStarted,
hasEnded: tbgInstanceState.state.hasEnded,
numPlayersMadeMove: tbgInstanceState.state.numPlayersMadeMove,
numActivePlayers: tbgInstanceState.state.numActivePlayers,
isOvertime: tbgInstanceState.state.isOvertime,
timePerTurn: tbgInstanceState.settings.timePerTurn,
maxPlayerCnt: tbgInstanceState.settings.maxPlayerCnt,
minPlayerCnt: tbgInstanceState.settings.minPlayerCnt,
timeToJoin: tbgInstanceState.settings.timeToJoin,
maxTurns: tbgInstanceState.settings.maxTurns,
voteCredits: tbgInstanceState.settings.voteCredits,
gameMaster: tbgInstanceState.settings.gameMaster
});
}
}
10 changes: 5 additions & 5 deletions test/RankifyInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ const mockValidVotes = async (
const startGame = async (gameId: BigNumberish) => {
const currentT = await time.latest();
await time.setNextBlockTimestamp(currentT + Number(RInstanceSettings.RInstance_TIME_TO_JOIN) + 1);
await mineBlocks(RInstanceSettings.RInstance_TIME_TO_JOIN + 1, hre);
await mineBlocks(RInstanceSettings.RInstance_TIME_TO_JOIN + 1);
await rankifyInstance.connect(adr.gameMaster1.wallet).startGame(gameId);
};

Expand Down Expand Up @@ -216,7 +216,7 @@ const fillParty = async (
if (shiftTime) {
const currentT = await time.latest();
await time.setNextBlockTimestamp(currentT + Number(RInstanceSettings.RInstance_TIME_TO_JOIN) + 1);
await mineBlocks(1, hre);
await mineBlocks(1);
}
if (startGame && gameMaster) {
await rankifyInstance.connect(gameMaster.wallet).startGame(gameId);
Expand Down Expand Up @@ -687,7 +687,7 @@ describe(scriptName, () => {
).to.be.revertedWith('Game has not yet started');
});
it('Cannot be started if not enough players', async () => {
await mineBlocks(RInstanceSettings.RInstance_TIME_TO_JOIN + 1, hre);
await mineBlocks(RInstanceSettings.RInstance_TIME_TO_JOIN + 1);
await expect(rankifyInstance.connect(adr.gameMaster1.wallet).startGame(1)).to.be.revertedWith(
'startGame->Not enough players',
);
Expand All @@ -702,7 +702,7 @@ describe(scriptName, () => {
);
const currentT = await time.latest();
await time.setNextBlockTimestamp(currentT + Number(RInstanceSettings.RInstance_TIME_TO_JOIN) + 1);
await mineBlocks(1, hre);
await mineBlocks(1);
await expect(rankifyInstance.connect(adr.gameMaster1.wallet).startGame(1)).to.be.emit(
rankifyInstance,
'GameStarted',
Expand Down Expand Up @@ -870,7 +870,7 @@ describe(scriptName, () => {
).to.be.revertedWith('Only game master');
});
it('Can end turn if timeout reached with zero scores', async () => {
await mineBlocks(RInstanceSettings.RInstance_TIME_PER_TURN + 1, hre);
await mineBlocks(RInstanceSettings.RInstance_TIME_PER_TURN + 1);
await expect(rankifyInstance.connect(adr.gameMaster1.wallet).endTurn(1, [], [], []))
.to.be.emit(rankifyInstance, 'TurnEnded')
.withArgs(
Expand Down

0 comments on commit c3747d9

Please sign in to comment.