From eb492d4a0c4495a67b0c4f657a1a790ea6f68275 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Thu, 6 Feb 2025 20:20:35 +0100 Subject: [PATCH 1/4] refactor(contracts)!: remove enforced mapping for extensive flexibility BREAKING CHANGE: the enforcement is going to be handled by devs explicitly --- .../contracts/src/core/interfaces/IPolicy.sol | 3 - .../src/core/policy/AdvancedPolicy.sol | 24 +--- .../contracts/src/core/policy/BasePolicy.sol | 6 - .../contracts/src/test/Advanced.t.sol | 127 ++---------------- .../contracts/contracts/src/test/Base.t.sol | 41 +----- .../advanced/AdvancedERC721PolicyFactory.sol | 5 +- .../src/test/advanced/AdvancedVoting.sol | 36 ++--- .../contracts/src/test/base/BaseVoting.sol | 12 +- packages/contracts/test/Advanced.test.ts | 113 ++++------------ packages/contracts/test/Base.test.ts | 36 +---- 10 files changed, 69 insertions(+), 334 deletions(-) diff --git a/packages/contracts/contracts/src/core/interfaces/IPolicy.sol b/packages/contracts/contracts/src/core/interfaces/IPolicy.sol index 4c1afe2..70cc6cd 100644 --- a/packages/contracts/contracts/src/core/interfaces/IPolicy.sol +++ b/packages/contracts/contracts/src/core/interfaces/IPolicy.sol @@ -24,9 +24,6 @@ interface IPolicy { /// @notice Error thrown when attempting to set the target more than once. error TargetAlreadySet(); - /// @notice Error thrown when a subject is already enforced. - error AlreadyEnforced(); - /// @notice Retrieves the policy trait identifier. /// @dev This is typically used to distinguish policy implementations (e.g., "Semaphore"). /// @return The policy trait string. diff --git a/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol b/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol index dd2cf32..d436c81 100644 --- a/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol +++ b/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import {IAdvancedPolicy, Check} from "../interfaces/IAdvancedPolicy.sol"; -import {AdvancedChecker, CheckStatus} from "../checker/AdvancedChecker.sol"; +import {AdvancedChecker} from "../checker/AdvancedChecker.sol"; import {Policy} from "./Policy.sol"; /// @title AdvancedPolicy @@ -18,21 +18,15 @@ abstract contract AdvancedPolicy is IAdvancedPolicy, Policy { /// @notice Controls whether post-condition checks are required. bool public SKIP_POST; - /// @notice Controls whether main check can be executed multiple times. - bool public ALLOW_MULTIPLE_MAIN; - - /// @notice Tracks enforcement status for each subject for each phase. - mapping(address => CheckStatus) public enforced; - /// @notice Initializes the contract with appended bytes data for configuration. /// @dev Decodes AdvancedChecker address and sets the owner. function _initialize() internal virtual override { super._initialize(); bytes memory data = _getAppendedBytes(); - (address sender, address advCheckerAddr, bool skipPre, bool skipPost, bool allowMultipleMain) = abi.decode( + (address sender, address advCheckerAddr, bool skipPre, bool skipPost) = abi.decode( data, - (address, address, bool, bool, bool) + (address, address, bool, bool) ); _transferOwnership(sender); @@ -40,7 +34,6 @@ abstract contract AdvancedPolicy is IAdvancedPolicy, Policy { ADVANCED_CHECKER = AdvancedChecker(advCheckerAddr); SKIP_PRE = skipPre; SKIP_POST = skipPost; - ALLOW_MULTIPLE_MAIN = allowMultipleMain; } /// @notice Enforces a multi-stage policy check. @@ -57,21 +50,10 @@ abstract contract AdvancedPolicy is IAdvancedPolicy, Policy { /// @param evidence Evidence required for validation. /// @param checkType The type of check performed (PRE, MAIN, POST). function _enforce(address subject, bytes[] calldata evidence, Check checkType) internal { - CheckStatus storage status = enforced[subject]; - if (checkType == Check.PRE) { if (SKIP_PRE) revert CannotPreCheckWhenSkipped(); - if (status.pre) revert AlreadyEnforced(); - status.pre = true; } else if (checkType == Check.POST) { if (SKIP_POST) revert CannotPostCheckWhenSkipped(); - if (status.main == 0) revert MainCheckNotEnforced(); - if (status.post) revert AlreadyEnforced(); - status.post = true; - } else { - if (!SKIP_PRE && !status.pre) revert PreCheckNotEnforced(); - if (!ALLOW_MULTIPLE_MAIN && status.main > 0) revert MainCheckAlreadyEnforced(); - status.main += 1; } if (!ADVANCED_CHECKER.check(subject, evidence, checkType)) revert UnsuccessfulCheck(); diff --git a/packages/contracts/contracts/src/core/policy/BasePolicy.sol b/packages/contracts/contracts/src/core/policy/BasePolicy.sol index 4af62d2..a2b6216 100644 --- a/packages/contracts/contracts/src/core/policy/BasePolicy.sol +++ b/packages/contracts/contracts/src/core/policy/BasePolicy.sol @@ -12,9 +12,6 @@ abstract contract BasePolicy is Policy, IBasePolicy { /// @notice Reference to the BaseChecker contract used for validation. BaseChecker public BASE_CHECKER; - /// @notice Tracks enforcement status for each subject. - mapping(address => bool) public enforced; - /// @notice Initializes the contract with appended bytes data for configuration. /// @dev Decodes BaseChecker address and sets the owner. function _initialize() internal virtual override { @@ -40,11 +37,8 @@ abstract contract BasePolicy is Policy, IBasePolicy { /// @param subject Address to enforce the policy on. /// @param evidence Evidence required for validation. function _enforce(address subject, bytes[] memory evidence) internal { - if (enforced[subject]) revert AlreadyEnforced(); if (!BASE_CHECKER.check(subject, evidence)) revert UnsuccessfulCheck(); - enforced[subject] = true; - emit Enforced(subject, target, evidence); } } diff --git a/packages/contracts/contracts/src/test/Advanced.t.sol b/packages/contracts/contracts/src/test/Advanced.t.sol index ca23a53..bafb430 100644 --- a/packages/contracts/contracts/src/test/Advanced.t.sol +++ b/packages/contracts/contracts/src/test/Advanced.t.sol @@ -192,13 +192,13 @@ contract AdvancedPolicy is Test { policyFactory = new AdvancedERC721PolicyFactory(); vm.recordLogs(); - policyFactory.deploy(address(advancedChecker), false, false, true); + policyFactory.deploy(address(advancedChecker), false, false); entries = vm.getRecordedLogs(); address policyClone = address(uint160(uint256(entries[0].topics[1]))); policy = AdvancedERC721Policy(policyClone); vm.recordLogs(); - policyFactory.deploy(address(advancedChecker), true, true, false); + policyFactory.deploy(address(advancedChecker), true, true); entries = vm.getRecordedLogs(); address policyCloneSkipped = address(uint160(uint256(entries[0].topics[1]))); policySkipped = AdvancedERC721Policy(policyCloneSkipped); @@ -223,14 +223,8 @@ contract AdvancedPolicy is Test { } function test_policy_getAppendedBytes() public { - assertEq( - policy.getAppendedBytes(), - abi.encode(address(deployer), address(advancedChecker), false, false, true) - ); - assertEq( - policySkipped.getAppendedBytes(), - abi.encode(address(deployer), address(advancedChecker), true, true, false) - ); + assertEq(policy.getAppendedBytes(), abi.encode(address(deployer), address(advancedChecker), false, false)); + assertEq(policySkipped.getAppendedBytes(), abi.encode(address(deployer), address(advancedChecker), true, true)); } function test_policy_trait_returnsCorrectValue() public view { @@ -357,24 +351,6 @@ contract AdvancedPolicy is Test { vm.stopPrank(); } - function test_policy_enforcePre_whenAlreadyEnforced_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(target); - signupNft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(target); - - policy.enforce(subject, evidence, Check.PRE); - - vm.expectRevert(abi.encodeWithSelector(IPolicy.AlreadyEnforced.selector)); - policy.enforce(subject, evidence, Check.PRE); - - vm.stopPrank(); - } - function test_policy_enforceMain_whenCallerNotTarget_reverts() public { vm.startPrank(deployer); @@ -418,22 +394,6 @@ contract AdvancedPolicy is Test { vm.stopPrank(); } - function test_policy_enforceMain_whenPreCheckMissing_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(target); - signupNft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(target); - - vm.expectRevert(abi.encodeWithSelector(IAdvancedPolicy.PreCheckNotEnforced.selector)); - policy.enforce(subject, evidence, Check.MAIN); - - vm.stopPrank(); - } - function test_policy_enforceMain_whenValid_succeeds() public { vm.startPrank(deployer); @@ -479,41 +439,6 @@ contract AdvancedPolicy is Test { vm.stopPrank(); } - function test_policy_enforceMain_whenMultipleNotAllowed_reverts() public { - vm.startPrank(deployer); - - policySkipped.setTarget(target); - signupNft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(target); - - policySkipped.enforce(subject, evidence, Check.MAIN); - - vm.expectRevert(abi.encodeWithSelector(IAdvancedPolicy.MainCheckAlreadyEnforced.selector)); - policySkipped.enforce(subject, evidence, Check.MAIN); - - vm.stopPrank(); - } - - function test_policy_enforcePost_whenPreCheckMissing_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(target); - signupNft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(target); - policy.enforce(subject, evidence, Check.PRE); - - vm.expectRevert(abi.encodeWithSelector(IAdvancedPolicy.MainCheckNotEnforced.selector)); - policy.enforce(subject, evidence, Check.POST); - - vm.stopPrank(); - } - function test_policy_enforcePost_whenCallerNotTarget_reverts() public { vm.startPrank(deployer); @@ -588,26 +513,6 @@ contract AdvancedPolicy is Test { vm.stopPrank(); } - - function test_policy_enforcePost_whenAlreadyEnforced_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(target); - signupNft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(target); - - policy.enforce(subject, evidence, Check.PRE); - policy.enforce(subject, evidence, Check.MAIN); - policy.enforce(subject, evidence, Check.POST); - - vm.expectRevert(abi.encodeWithSelector(IPolicy.AlreadyEnforced.selector)); - policy.enforce(subject, evidence, Check.POST); - - vm.stopPrank(); - } } contract Voting is Test { @@ -657,7 +562,7 @@ contract Voting is Test { policyFactory = new AdvancedERC721PolicyFactory(); vm.recordLogs(); - policyFactory.deploy(address(advancedChecker), false, false, true); + policyFactory.deploy(address(advancedChecker), false, false); entries = vm.getRecordedLogs(); address policyClone = address(uint160(uint256(entries[0].topics[1]))); policy = AdvancedERC721Policy(policyClone); @@ -688,7 +593,9 @@ contract Voting is Test { function test_voting_deployed() public view { assertEq(address(voting.POLICY()), address(policy)); - assertEq(voting.voteCounts(0), 0); + assertEq(voting.registered(subject), false); + assertEq(voting.hasVoted(subject), false); + assertEq(voting.isEligible(subject), false); } function test_register_whenCallerNotTarget_reverts() public { @@ -757,24 +664,6 @@ contract Voting is Test { vm.stopPrank(); } - function test_register_whenAlreadyRegistered_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(address(voting)); - signupNft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(subject); - - voting.register(0); - - vm.expectRevert(abi.encodeWithSelector(IPolicy.AlreadyEnforced.selector)); - voting.register(0); - - vm.stopPrank(); - } - function test_vote_whenNotRegistered_reverts() public { vm.startPrank(deployer); diff --git a/packages/contracts/contracts/src/test/Base.t.sol b/packages/contracts/contracts/src/test/Base.t.sol index 4609ae9..2266dcb 100644 --- a/packages/contracts/contracts/src/test/Base.t.sol +++ b/packages/contracts/contracts/src/test/Base.t.sol @@ -257,24 +257,6 @@ contract BasePolicy is Test { vm.stopPrank(); } - - function test_policy_enforce_whenAlreadyEnforced_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(target); - nft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(target); - - policy.enforce(subject, evidence); - - vm.expectRevert(abi.encodeWithSelector(IPolicy.AlreadyEnforced.selector)); - policy.enforce(subject, evidence); - - vm.stopPrank(); - } } contract Voting is Test { @@ -320,7 +302,7 @@ contract Voting is Test { function test_voting_deployed() public view { assertEq(address(voting.POLICY()), address(policy)); assertEq(voting.hasVoted(subject), false); - assertEq(voting.voteCounts(0), 0); + assertEq(voting.registered(subject), false); } function test_register_whenCallerNotTarget_reverts() public { @@ -389,24 +371,6 @@ contract Voting is Test { vm.stopPrank(); } - function test_register_whenAlreadyRegistered_reverts() public { - vm.startPrank(deployer); - - policy.setTarget(address(voting)); - nft.mint(subject); - - vm.stopPrank(); - - vm.startPrank(subject); - - voting.register(0); - - vm.expectRevert(abi.encodeWithSelector(IPolicy.AlreadyEnforced.selector)); - voting.register(0); - - vm.stopPrank(); - } - function test_vote_whenNotRegistered_reverts() public { vm.startPrank(deployer); @@ -451,13 +415,14 @@ contract Voting is Test { vm.startPrank(subject); voting.register(0); + assertEq(voting.registered(subject), true); + vm.expectEmit(true, true, true, true); emit Voted(subject, 0); voting.vote(0); assertEq(voting.hasVoted(subject), true); - assertEq(voting.voteCounts(0), 1); vm.stopPrank(); } diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol b/packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol index fd53c32..f67a2c2 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol +++ b/packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol @@ -15,9 +15,8 @@ contract AdvancedERC721PolicyFactory is Factory { /// @param _checkerAddr Address of the associated checker contract. /// @param _skipPre Whether to skip pre-checks. /// @param _skipPost Whether to skip post-checks. - /// @param _allowMultipleMain Whether multiple main checks are allowed. - function deploy(address _checkerAddr, bool _skipPre, bool _skipPost, bool _allowMultipleMain) public { - bytes memory data = abi.encode(msg.sender, _checkerAddr, _skipPre, _skipPost, _allowMultipleMain); + function deploy(address _checkerAddr, bool _skipPre, bool _skipPost) public { + bytes memory data = abi.encode(msg.sender, _checkerAddr, _skipPre, _skipPost); address clone = super._deploy(data); diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol b/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol index b46eb1f..22ba2aa 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol +++ b/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol @@ -39,8 +39,14 @@ contract AdvancedVoting { /// @notice Reference to the policy contract enforcing multi-phase validation. AdvancedPolicy public immutable POLICY; - /// @notice Tracks the vote count for each option (0 or 1). - mapping(uint8 => uint256) public voteCounts; + /// @dev Tracks whether an address has been registered. + mapping(address => bool) public registered; + + /// @dev Tracks whether an address has voted. + mapping(address => bool) public hasVoted; + + /// @dev Tracks whether an address has been marked as eligible. + mapping(address => bool) public isEligible; /// @notice Constructor to set the policy contract. /// @param _policy Address of the AdvancedPolicy contract to use for validation. @@ -59,6 +65,9 @@ contract AdvancedVoting { // Enforce the pre-check phase using the provided policy. POLICY.enforce(msg.sender, _evidence, Check.PRE); + // Track enforcement. + registered[msg.sender] = true; + // Emit an event to log the registration. emit Registered(msg.sender); } @@ -67,11 +76,8 @@ contract AdvancedVoting { /// @dev Enforces the main-check phase and updates the vote count. /// @param option The chosen voting option (0 or 1). function vote(uint8 option) external { - // Retrieve the enforcement status of the sender from the policy. - (bool pre, , ) = POLICY.enforced(msg.sender); - // Ensure the user has registered before voting. - if (!pre) revert NotRegistered(); + if (!registered[msg.sender]) revert NotRegistered(); // Validate that the voting option is within the allowed range. if (option >= 2) revert InvalidOption(); @@ -83,10 +89,8 @@ contract AdvancedVoting { // Enforce the main-check phase using the policy. POLICY.enforce(msg.sender, _evidence, Check.MAIN); - // Increment the vote count for the chosen option. - unchecked { - voteCounts[option]++; - } + // Record the vote. + hasVoted[msg.sender] = true; // Emit an event to log the voting action. emit Voted(msg.sender, option); @@ -95,21 +99,21 @@ contract AdvancedVoting { /// @notice Verifies a user's eligibility after voting has concluded. /// @dev Enforces the post-check phase to ensure eligibility criteria are met. function eligible() external { - // Retrieve the enforcement status for all phases. - (bool pre, uint8 main, bool post) = POLICY.enforced(msg.sender); - // Ensure the user has completed the registration phase. - if (!pre) revert NotRegistered(); + if (!registered[msg.sender]) revert NotRegistered(); // Ensure the user has cast at least one vote. - if (main == 0) revert NotVoted(); + if (!hasVoted[msg.sender]) revert NotVoted(); // Ensure the user has not already been marked as eligible. - if (post) revert AlreadyEligible(); + if (isEligible[msg.sender]) revert AlreadyEligible(); // Enforce the post-check phase using the policy. POLICY.enforce(msg.sender, new bytes[](1), Check.POST); + // Record eligibility. + isEligible[msg.sender] = true; + // Emit an event to log the eligibility status. emit Eligible(msg.sender); } diff --git a/packages/contracts/contracts/src/test/base/BaseVoting.sol b/packages/contracts/contracts/src/test/base/BaseVoting.sol index a6d76b7..fe98639 100644 --- a/packages/contracts/contracts/src/test/base/BaseVoting.sol +++ b/packages/contracts/contracts/src/test/base/BaseVoting.sol @@ -28,12 +28,12 @@ contract BaseVoting { /// @notice Policy contract enforcing NFT-based registration. BaseERC721Policy public immutable POLICY; + /// @dev Tracks whether an address has been registered. + mapping(address => bool) public registered; + /// @dev Tracks whether an address has voted. mapping(address => bool) public hasVoted; - /// @dev Tracks the number of votes for each option. - mapping(uint8 => uint256) public voteCounts; - /// @notice Initializes the voting system with a specific policy contract. /// @param _policy Address of the policy contract enforcing access control. constructor(BaseERC721Policy _policy) { @@ -51,6 +51,9 @@ contract BaseVoting { // Enforce NFT ownership validation. POLICY.enforce(msg.sender, _evidence); + // Track enforcement. + registered[msg.sender] = true; + emit Registered(msg.sender); } @@ -59,13 +62,12 @@ contract BaseVoting { /// @param option The chosen voting option (0 or 1). function vote(uint8 option) external { // Check registration and voting status. - if (!POLICY.enforced(msg.sender)) revert NotRegistered(); + if (!registered[msg.sender]) revert NotRegistered(); if (hasVoted[msg.sender]) revert AlreadyVoted(); if (option >= 2) revert InvalidOption(); // Record the vote. hasVoted[msg.sender] = true; - voteCounts[option]++; emit Voted(msg.sender, option); } diff --git a/packages/contracts/test/Advanced.test.ts b/packages/contracts/test/Advanced.test.ts index b36fed2..db7ea41 100644 --- a/packages/contracts/test/Advanced.test.ts +++ b/packages/contracts/test/Advanced.test.ts @@ -289,8 +289,7 @@ describe("Advanced", () => { const advancedPolicyTx = await advancedPolicyFactory.deploy( await advancedChecker.getAddress(), false, - false, - true + false ) const advancedPolicyTxReceipt = await advancedPolicyTx.wait() const advancedPolicyCloneDeployedEvent = AdvancedERC721PolicyFactory.interface.parseLog( @@ -309,8 +308,7 @@ describe("Advanced", () => { const advancedPolicSkippedTx = await advancedPolicyFactory.deploy( await advancedChecker.getAddress(), true, - true, - false + true ) const advancedPolicySkippedTxReceipt = await advancedPolicSkippedTx.wait() const advancedPolicySkippedCloneDeployedEvent = AdvancedERC721PolicyFactory.interface.parseLog( @@ -386,8 +384,8 @@ describe("Advanced", () => { const expectedBytes = AbiCoder.defaultAbiCoder() .encode( - ["address", "address", "bool", "bool", "bool"], - [await deployer.getAddress(), await advancedChecker.getAddress(), false, false, true] + ["address", "address", "bool", "bool"], + [await deployer.getAddress(), await advancedChecker.getAddress(), false, false] ) .toLowerCase() @@ -397,8 +395,8 @@ describe("Advanced", () => { const expectedBytesSkipped = AbiCoder.defaultAbiCoder() .encode( - ["address", "address", "bool", "bool", "bool"], - [await deployer.getAddress(), await advancedChecker.getAddress(), true, true, false] + ["address", "address", "bool", "bool"], + [await deployer.getAddress(), await advancedChecker.getAddress(), true, true] ) .toLowerCase() @@ -535,20 +533,6 @@ describe("Advanced", () => { expect(event.args.target).to.eq(targetAddress) expect(event.args.evidence[0]).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(0) - expect((await advancedPolicy.enforced(subjectAddress))[0]).to.be.equal(true) - }) - - it("reverts when pre already enforced", async () => { - const { advancedPolicy, target, subjectAddress, validEncodedNFTId } = - await loadFixture(deployAdvancedPolicyFixture) - - await advancedPolicy.setTarget(await target.getAddress()) - - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - - await expect( - advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - ).to.be.revertedWithCustomError(advancedPolicy, "AlreadyEnforced") }) }) @@ -602,7 +586,6 @@ describe("Advanced", () => { expect(event.args.target).to.eq(targetAddress) expect(event.args.evidence[0]).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(1) - expect((await advancedPolicy.enforced(subjectAddress))[1]).to.be.equal(1) }) it("executes multiple mains when allowed", async () => { @@ -632,19 +615,6 @@ describe("Advanced", () => { expect(event.args.target).to.eq(targetAddress) expect(event.args.evidence[0]).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(1) - expect((await advancedPolicy.enforced(subjectAddress))[1]).to.be.equal(2) - }) - - it("reverts when main check already enfored", async () => { - const { advancedPolicySkipped, target, subjectAddress, validEncodedNFTId } = - await loadFixture(deployAdvancedPolicyFixture) - - await advancedPolicySkipped.setTarget(await target.getAddress()) - await advancedPolicySkipped.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) - - expect( - advancedPolicySkipped.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) - ).to.be.revertedWithCustomError(advancedPolicySkipped, "MainCheckAlreadyEnforced") }) }) @@ -752,21 +722,6 @@ describe("Advanced", () => { expect(event.args.target).to.eq(targetAddress) expect(event.args.evidence[0]).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(2) - expect((await advancedPolicy.enforced(subjectAddress))[2]).to.be.equal(true) - }) - - it("reverts when post already enforced", async () => { - const { advancedPolicy, target, subjectAddress, validEncodedNFTId } = - await loadFixture(deployAdvancedPolicyFixture) - - await advancedPolicy.setTarget(await target.getAddress()) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 2) - - await expect( - advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 2) - ).to.be.revertedWithCustomError(advancedPolicy, "AlreadyEnforced") }) }) }) @@ -843,8 +798,7 @@ describe("Advanced", () => { const advancedPolicyTx = await advancedPolicyFactory.deploy( await advancedChecker.getAddress(), false, - false, - true + false ) const advancedPolicyTxReceipt = await advancedPolicyTx.wait() const advancedPolicyCloneDeployedEvent = AdvancedERC721PolicyFactory.interface.parseLog( @@ -951,25 +905,9 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.voter).to.eq(subjectAddress) - expect((await advancedPolicy.enforced(subjectAddress))[0]).to.be.equal(true) - expect((await advancedPolicy.enforced(subjectAddress))[1]).to.be.equal(0n) - expect(await advancedVoting.voteCounts(0)).to.be.equal(0) - expect(await advancedVoting.voteCounts(1)).to.be.equal(0) - }) - - it("reverts when already registered", async () => { - const { advancedVoting, advancedPolicy, subject, validEncodedNFTId } = - await loadFixture(deployAdvancedVotingFixture) - const targetAddress = await advancedVoting.getAddress() - - await advancedPolicy.setTarget(targetAddress) - - await advancedVoting.connect(subject).register(validEncodedNFTId) - - await expect(advancedVoting.connect(subject).register(validEncodedNFTId)).to.be.revertedWithCustomError( - advancedPolicy, - "AlreadyEnforced" - ) + expect(await advancedVoting.registered(subject)).to.be.equal(true) + expect(await advancedVoting.hasVoted(subject)).to.be.equal(false) + expect(await advancedVoting.isEligible(subject)).to.be.equal(false) }) }) @@ -1021,10 +959,9 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.voter).to.eq(subjectAddress) expect(event.args.option).to.eq(option) - expect((await advancedPolicy.enforced(subjectAddress))[0]).to.be.equal(true) - expect((await advancedPolicy.enforced(subjectAddress))[1]).to.be.equal(1n) - expect(await advancedVoting.voteCounts(0)).to.be.equal(1) - expect(await advancedVoting.voteCounts(1)).to.be.equal(0) + expect(await advancedVoting.registered(subject)).to.be.equal(true) + expect(await advancedVoting.hasVoted(subject)).to.be.equal(true) + expect(await advancedVoting.isEligible(subject)).to.be.equal(false) }) it("allows multiple votes", async () => { @@ -1051,10 +988,9 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.voter).to.eq(subjectAddress) expect(event.args.option).to.eq(option) - expect((await advancedPolicy.enforced(subjectAddress))[0]).to.be.equal(true) - expect((await advancedPolicy.enforced(subjectAddress))[1]).to.be.equal(2n) - expect(await advancedVoting.voteCounts(0)).to.be.equal(2) - expect(await advancedVoting.voteCounts(1)).to.be.equal(0) + expect(await advancedVoting.registered(subject)).to.be.equal(true) + expect(await advancedVoting.hasVoted(subject)).to.be.equal(true) + expect(await advancedVoting.isEligible(subject)).to.be.equal(false) }) }) @@ -1159,11 +1095,9 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.voter).to.eq(subjectAddress) - expect((await advancedPolicy.enforced(subjectAddress))[0]).to.be.equal(true) - expect((await advancedPolicy.enforced(subjectAddress))[1]).to.be.equal(1n) - expect((await advancedPolicy.enforced(subjectAddress))[2]).to.be.equal(true) - expect(await advancedVoting.voteCounts(0)).to.be.equal(1) - expect(await advancedVoting.voteCounts(1)).to.be.equal(0) + expect(await advancedVoting.registered(subject)).to.be.equal(true) + expect(await advancedVoting.hasVoted(subject)).to.be.equal(true) + expect(await advancedVoting.isEligible(subject)).to.be.equal(true) }) it("reverts when already eligible", async () => { @@ -1247,8 +1181,7 @@ describe("Advanced", () => { const advancedPolicyTx = await advancedPolicyFactory.deploy( await advancedChecker.getAddress(), false, - false, - true + false ) const advancedPolicyTxReceipt = await advancedPolicyTx.wait() const advancedPolicyCloneDeployedEvent = AdvancedERC721PolicyFactory.interface.parseLog( @@ -1287,9 +1220,9 @@ describe("Advanced", () => { // reward. await advancedVoting.connect(voter).eligible() - expect((await advancedPolicy.enforced(voterAddress))[0]).to.be.equal(true) - expect((await advancedPolicy.enforced(voterAddress))[1]).to.be.equal(1) - expect((await advancedPolicy.enforced(voterAddress))[2]).to.be.equal(true) + expect(await advancedVoting.registered(voter)).to.be.equal(true) + expect(await advancedVoting.hasVoted(voter)).to.be.equal(true) + expect(await advancedVoting.isEligible(voter)).to.be.equal(true) } }) }) diff --git a/packages/contracts/test/Base.test.ts b/packages/contracts/test/Base.test.ts index f2527d9..48717fe 100644 --- a/packages/contracts/test/Base.test.ts +++ b/packages/contracts/test/Base.test.ts @@ -335,19 +335,6 @@ describe("Base", () => { expect(event.args.subject).to.eq(subjectAddress) expect(event.args.target).to.eq(targetAddress) expect(event.args.evidence[0]).to.eq(validEncodedNFTId) - expect(await policy.enforced(subjectAddress)).to.be.equal(true) - }) - - it("reverts when already enforced", async () => { - const { policy, target, subjectAddress, validEncodedNFTId } = await loadFixture(deployBasePolicyFixture) - - await policy.setTarget(await target.getAddress()) - - await policy.connect(target).enforce(subjectAddress, [validEncodedNFTId]) - - await expect( - policy.connect(target).enforce(subjectAddress, [validEncodedNFTId]) - ).to.be.revertedWithCustomError(policy, "AlreadyEnforced") }) }) }) @@ -436,8 +423,8 @@ describe("Base", () => { const { baseVoting, subject } = await loadFixture(deployBaseVotingFixture) expect(baseVoting).to.not.eq(undefined) + expect(await baseVoting.registered(subject)).to.be.eq(false) expect(await baseVoting.hasVoted(subject)).to.be.eq(false) - expect(await baseVoting.voteCounts(0)).to.be.eq(0) }) }) @@ -495,24 +482,8 @@ describe("Base", () => { expect(receipt?.status).to.eq(1) expect(event.args.voter).to.eq(subjectAddress) - expect(await policy.enforced(subjectAddress)).to.be.equal(true) + expect(await baseVoting.registered(subjectAddress)).to.be.equal(true) expect(await baseVoting.hasVoted(subjectAddress)).to.be.equal(false) - expect(await baseVoting.voteCounts(0)).to.be.equal(0) - expect(await baseVoting.voteCounts(1)).to.be.equal(0) - }) - - it("reverts when already registered", async () => { - const { baseVoting, policy, subject, validNFTId } = await loadFixture(deployBaseVotingFixture) - const targetAddress = await baseVoting.getAddress() - - await policy.setTarget(targetAddress) - - await baseVoting.connect(subject).register(validNFTId) - - await expect(baseVoting.connect(subject).register(validNFTId)).to.be.revertedWithCustomError( - policy, - "AlreadyEnforced" - ) }) }) @@ -562,9 +533,8 @@ describe("Base", () => { expect(receipt?.status).to.eq(1) expect(event.args.voter).to.eq(subjectAddress) expect(event.args.option).to.eq(option) + expect(await baseVoting.registered(subjectAddress)).to.be.equal(true) expect(await baseVoting.hasVoted(subjectAddress)).to.be.equal(true) - expect(await baseVoting.voteCounts(0)).to.be.equal(1) - expect(await baseVoting.voteCounts(1)).to.be.equal(0) }) it("reverts when already voted", async () => { From 70432edecf49f1ea28b74a5c0fd9b5da82764138 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Thu, 6 Feb 2025 20:35:12 +0100 Subject: [PATCH 2/4] refactor(contracts)!: remove evidence array BREAKING CHANGE: the array is not needed, we can just do abi.encode() --- .../src/core/checker/AdvancedChecker.sol | 20 ++--- .../src/core/checker/BaseChecker.sol | 8 +- .../src/core/interfaces/IAdvancedChecker.sol | 4 +- .../src/core/interfaces/IAdvancedPolicy.sol | 8 +- .../src/core/interfaces/IBaseChecker.sol | 4 +- .../src/core/interfaces/IBasePolicy.sol | 8 +- .../src/core/policy/AdvancedPolicy.sol | 8 +- .../contracts/src/core/policy/BasePolicy.sol | 8 +- .../contracts/src/test/Advanced.t.sol | 20 ++--- .../contracts/contracts/src/test/Base.t.sol | 11 +-- .../test/advanced/AdvancedERC721Checker.sol | 6 +- .../src/test/advanced/AdvancedVoting.sol | 14 +--- .../src/test/base/BaseERC721Checker.sol | 4 +- .../contracts/src/test/base/BaseVoting.sol | 6 +- packages/contracts/test/Advanced.test.ts | 82 +++++++++---------- packages/contracts/test/Base.test.ts | 16 ++-- 16 files changed, 102 insertions(+), 125 deletions(-) diff --git a/packages/contracts/contracts/src/core/checker/AdvancedChecker.sol b/packages/contracts/contracts/src/core/checker/AdvancedChecker.sol index b89c752..e012a34 100644 --- a/packages/contracts/contracts/src/core/checker/AdvancedChecker.sol +++ b/packages/contracts/contracts/src/core/checker/AdvancedChecker.sol @@ -12,12 +12,12 @@ abstract contract AdvancedChecker is Clone, IAdvancedChecker { /// @notice Validates a subject's evidence for a specific check phase. /// @dev External entry point for validation checks, delegating logic to `_check`. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @param checkType The phase of validation to execute (PRE, MAIN, POST). /// @return checked Boolean indicating whether the validation passed. function check( address subject, - bytes[] calldata evidence, + bytes calldata evidence, Check checkType ) external view override returns (bool checked) { return _check(subject, evidence, checkType); @@ -26,10 +26,10 @@ abstract contract AdvancedChecker is Clone, IAdvancedChecker { /// @notice Core validation logic dispatcher. /// @dev Routes validation calls to specific phase methods (_checkPre, _checkMain, _checkPost). /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @param checkType The phase of validation to execute. /// @return checked Boolean indicating whether the validation passed. - function _check(address subject, bytes[] calldata evidence, Check checkType) internal view returns (bool checked) { + function _check(address subject, bytes calldata evidence, Check checkType) internal view returns (bool checked) { if (checkType == Check.PRE) { return _checkPre(subject, evidence); } @@ -44,21 +44,21 @@ abstract contract AdvancedChecker is Clone, IAdvancedChecker { /// @notice Pre-condition validation logic. /// @dev Derived contracts should override this to implement pre-check validation. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @return checked Boolean indicating whether the validation passed. - function _checkPre(address subject, bytes[] calldata evidence) internal view virtual returns (bool checked) {} + function _checkPre(address subject, bytes calldata evidence) internal view virtual returns (bool checked) {} /// @notice Main validation logic. /// @dev Derived contracts should override this to implement main check validation. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @return checked Boolean indicating whether the validation passed. - function _checkMain(address subject, bytes[] calldata evidence) internal view virtual returns (bool checked) {} + function _checkMain(address subject, bytes calldata evidence) internal view virtual returns (bool checked) {} /// @notice Post-condition validation logic. /// @dev Derived contracts should override this to implement post-check validation. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @return checked Boolean indicating whether the validation passed. - function _checkPost(address subject, bytes[] calldata evidence) internal view virtual returns (bool checked) {} + function _checkPost(address subject, bytes calldata evidence) internal view virtual returns (bool checked) {} } diff --git a/packages/contracts/contracts/src/core/checker/BaseChecker.sol b/packages/contracts/contracts/src/core/checker/BaseChecker.sol index 0b3bdf2..dd5ece5 100644 --- a/packages/contracts/contracts/src/core/checker/BaseChecker.sol +++ b/packages/contracts/contracts/src/core/checker/BaseChecker.sol @@ -13,16 +13,16 @@ abstract contract BaseChecker is Clone, IBaseChecker { /// @dev External view function that calls the `_check` method, allowing derived contracts /// to implement custom validation logic. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @return checked Boolean indicating whether the validation passed. - function check(address subject, bytes[] calldata evidence) external view override returns (bool checked) { + function check(address subject, bytes calldata evidence) external view override returns (bool checked) { return _check(subject, evidence); } /// @notice Internal validation logic implementation. /// @dev Must be overridden by derived contracts to define custom validation rules. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @return checked Boolean indicating whether the validation passed. - function _check(address subject, bytes[] calldata evidence) internal view virtual returns (bool checked) {} + function _check(address subject, bytes calldata evidence) internal view virtual returns (bool checked) {} } diff --git a/packages/contracts/contracts/src/core/interfaces/IAdvancedChecker.sol b/packages/contracts/contracts/src/core/interfaces/IAdvancedChecker.sol index 13a9441..47b0ea6 100644 --- a/packages/contracts/contracts/src/core/interfaces/IAdvancedChecker.sol +++ b/packages/contracts/contracts/src/core/interfaces/IAdvancedChecker.sol @@ -32,8 +32,8 @@ interface IAdvancedChecker { /// @notice Validates a subject for a specific check phase. /// @dev Implementations should route to appropriate phase-specific logic. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @param checkType The phase of validation to execute (PRE, MAIN, POST). /// @return checked Boolean indicating whether the validation passed. - function check(address subject, bytes[] calldata evidence, Check checkType) external view returns (bool checked); + function check(address subject, bytes calldata evidence, Check checkType) external view returns (bool checked); } diff --git a/packages/contracts/contracts/src/core/interfaces/IAdvancedPolicy.sol b/packages/contracts/contracts/src/core/interfaces/IAdvancedPolicy.sol index 62a3626..126be12 100644 --- a/packages/contracts/contracts/src/core/interfaces/IAdvancedPolicy.sol +++ b/packages/contracts/contracts/src/core/interfaces/IAdvancedPolicy.sol @@ -26,14 +26,14 @@ interface IAdvancedPolicy is IPolicy { /// @notice Emitted when a subject successfully passes a validation check. /// @param subject Address that passed the validation. /// @param target Address of the protected contract. - /// @param evidence Data used during validation. + /// @param evidence Custom validation data. /// @param checkType The type of check performed (PRE, MAIN, POST). - event Enforced(address indexed subject, address indexed target, bytes[] evidence, Check checkType); + event Enforced(address indexed subject, address indexed target, bytes evidence, Check checkType); /// @notice Enforces a specific phase of the policy check on a given subject. /// @dev Delegates validation logic to the corresponding phase's check method. /// @param subject Address to validate. - /// @param evidence Data required for validation. + /// @param evidence Custom validation data. /// @param checkType The type of check performed (PRE, MAIN, POST). - function enforce(address subject, bytes[] calldata evidence, Check checkType) external; + function enforce(address subject, bytes calldata evidence, Check checkType) external; } diff --git a/packages/contracts/contracts/src/core/interfaces/IBaseChecker.sol b/packages/contracts/contracts/src/core/interfaces/IBaseChecker.sol index 299b520..6809dee 100644 --- a/packages/contracts/contracts/src/core/interfaces/IBaseChecker.sol +++ b/packages/contracts/contracts/src/core/interfaces/IBaseChecker.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.20; interface IBaseChecker { /// @notice Validates a subject against provided evidence. /// @param subject The address to validate. - /// @param evidence An array of custom validation data. + /// @param evidence Custom validation data. /// @return checked Boolean indicating whether the validation passed. - function check(address subject, bytes[] calldata evidence) external view returns (bool checked); + function check(address subject, bytes calldata evidence) external view returns (bool checked); } diff --git a/packages/contracts/contracts/src/core/interfaces/IBasePolicy.sol b/packages/contracts/contracts/src/core/interfaces/IBasePolicy.sol index 9fb1a6a..481265a 100644 --- a/packages/contracts/contracts/src/core/interfaces/IBasePolicy.sol +++ b/packages/contracts/contracts/src/core/interfaces/IBasePolicy.sol @@ -10,12 +10,12 @@ interface IBasePolicy is IPolicy { /// @notice Emitted when a subject successfully passes a policy enforcement check. /// @param subject Address that passed the validation. /// @param target Address of the protected contract. - /// @param evidence Data used during validation. - event Enforced(address indexed subject, address indexed target, bytes[] evidence); + /// @param evidence Custom validation data. + event Enforced(address indexed subject, address indexed target, bytes evidence); /// @notice Enforces a validation check on a given subject. /// @dev This method ensures that the provided subject meets the policy's criteria. /// @param subject Address to validate. - /// @param evidence Data required for validation. - function enforce(address subject, bytes[] calldata evidence) external; + /// @param evidence Custom validation data. + function enforce(address subject, bytes calldata evidence) external; } diff --git a/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol b/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol index d436c81..13f7e32 100644 --- a/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol +++ b/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol @@ -39,17 +39,17 @@ abstract contract AdvancedPolicy is IAdvancedPolicy, Policy { /// @notice Enforces a multi-stage policy check. /// @dev Handles pre, main, and post validation stages. Only callable by the target contract. /// @param subject Address to enforce the policy on. - /// @param evidence Evidence required for validation. + /// @param evidence Custom validation data. /// @param checkType The type of check performed (PRE, MAIN, POST). - function enforce(address subject, bytes[] calldata evidence, Check checkType) external override onlyTarget { + function enforce(address subject, bytes calldata evidence, Check checkType) external override onlyTarget { _enforce(subject, evidence, checkType); } /// @notice Internal implementation of multi-stage enforcement logic. /// @param subject Address to enforce the policy on. - /// @param evidence Evidence required for validation. + /// @param evidence Custom validation data. /// @param checkType The type of check performed (PRE, MAIN, POST). - function _enforce(address subject, bytes[] calldata evidence, Check checkType) internal { + function _enforce(address subject, bytes calldata evidence, Check checkType) internal { if (checkType == Check.PRE) { if (SKIP_PRE) revert CannotPreCheckWhenSkipped(); } else if (checkType == Check.POST) { diff --git a/packages/contracts/contracts/src/core/policy/BasePolicy.sol b/packages/contracts/contracts/src/core/policy/BasePolicy.sol index a2b6216..904eb33 100644 --- a/packages/contracts/contracts/src/core/policy/BasePolicy.sol +++ b/packages/contracts/contracts/src/core/policy/BasePolicy.sol @@ -28,15 +28,15 @@ abstract contract BasePolicy is Policy, IBasePolicy { /// @notice Enforces a policy check for a subject. /// @dev Uses the BaseChecker for validation logic. Only callable by the target contract. /// @param subject Address to enforce the policy on. - /// @param evidence Evidence required for validation. - function enforce(address subject, bytes[] calldata evidence) external override onlyTarget { + /// @param evidence Custom validation data. + function enforce(address subject, bytes calldata evidence) external override onlyTarget { _enforce(subject, evidence); } /// @notice Internal logic for enforcing policy checks. /// @param subject Address to enforce the policy on. - /// @param evidence Evidence required for validation. - function _enforce(address subject, bytes[] memory evidence) internal { + /// @param evidence Custom validation data. + function _enforce(address subject, bytes calldata evidence) internal { if (!BASE_CHECKER.check(subject, evidence)) revert UnsuccessfulCheck(); emit Enforced(subject, target, evidence); diff --git a/packages/contracts/contracts/src/test/Advanced.t.sol b/packages/contracts/contracts/src/test/Advanced.t.sol index bafb430..54ee31b 100644 --- a/packages/contracts/contracts/src/test/Advanced.t.sol +++ b/packages/contracts/contracts/src/test/Advanced.t.sol @@ -32,7 +32,7 @@ contract AdvancedChecker is Test { address public subject = vm.addr(0x3); address public notOwner = vm.addr(0x4); - bytes[] public evidence = new bytes[](1); + bytes public evidence = abi.encode(0); function setUp() public virtual { vm.startPrank(deployer); @@ -55,8 +55,6 @@ contract AdvancedChecker is Test { address advancedClone = address(uint160(uint256(entries[0].topics[1]))); advancedChecker = AdvancedERC721Checker(advancedClone); - evidence[0] = abi.encode(0); - vm.stopPrank(); } @@ -148,7 +146,7 @@ contract AdvancedChecker is Test { contract AdvancedPolicy is Test { event TargetSet(address indexed target); - event Enforced(address indexed subject, address indexed target, bytes[] evidence, Check checkType); + event Enforced(address indexed subject, address indexed target, bytes evidence, Check checkType); NFT internal signupNft; NFT internal rewardNft; @@ -165,8 +163,8 @@ contract AdvancedPolicy is Test { address public subject = vm.addr(0x3); address public notOwner = vm.addr(0x4); - bytes[] public evidence = new bytes[](1); - bytes[] public wrongEvidence = new bytes[](1); + bytes public evidence = abi.encode(0); + bytes public wrongEvidence = abi.encode(1); function setUp() public virtual { vm.startPrank(deployer); @@ -203,9 +201,6 @@ contract AdvancedPolicy is Test { address policyCloneSkipped = address(uint160(uint256(entries[0].topics[1]))); policySkipped = AdvancedERC721Policy(policyCloneSkipped); - evidence[0] = abi.encode(0); - wrongEvidence[0] = abi.encode(1); - vm.stopPrank(); } @@ -535,8 +530,8 @@ contract Voting is Test { address public subject = vm.addr(0x3); address public notOwner = vm.addr(0x4); - bytes[] public evidence = new bytes[](1); - bytes[] public wrongEvidence = new bytes[](1); + bytes public evidence = abi.encode(0); + bytes public wrongEvidence = abi.encode(1); function setUp() public virtual { vm.startPrank(deployer); @@ -567,9 +562,6 @@ contract Voting is Test { address policyClone = address(uint160(uint256(entries[0].topics[1]))); policy = AdvancedERC721Policy(policyClone); - evidence[0] = abi.encode(0); - wrongEvidence[0] = abi.encode(1); - voting = new AdvancedVoting(policy); vm.stopPrank(); diff --git a/packages/contracts/contracts/src/test/Base.t.sol b/packages/contracts/contracts/src/test/Base.t.sol index 2266dcb..1c87eb9 100644 --- a/packages/contracts/contracts/src/test/Base.t.sol +++ b/packages/contracts/contracts/src/test/Base.t.sol @@ -22,7 +22,8 @@ contract BaseChecker is Test { address public target = vm.addr(0x2); address public subject = vm.addr(0x3); address public notOwner = vm.addr(0x4); - bytes[] public evidence = new bytes[](1); + + bytes public evidence = abi.encode(0); function setUp() public { vm.startPrank(deployer); @@ -37,8 +38,6 @@ contract BaseChecker is Test { address baseClone = address(uint160(uint256(entries[0].topics[1]))); checker = BaseERC721Checker(baseClone); - evidence[0] = abi.encode(0); - vm.stopPrank(); } @@ -87,7 +86,7 @@ contract BaseChecker is Test { contract BasePolicy is Test { event TargetSet(address indexed target); - event Enforced(address indexed subject, address indexed target, bytes[] evidence); + event Enforced(address indexed subject, address indexed target, bytes evidence); NFT internal nft; BaseERC721Checker internal checker; @@ -100,7 +99,7 @@ contract BasePolicy is Test { address public subject = vm.addr(0x3); address public notOwner = vm.addr(0x4); - bytes[] public evidence = new bytes[](1); + bytes public evidence = abi.encode(0); function setUp() public virtual { vm.startPrank(deployer); @@ -122,8 +121,6 @@ contract BasePolicy is Test { address policyClone = address(uint160(uint256(entries[0].topics[1]))); policy = BaseERC721Policy(policyClone); - evidence[0] = abi.encode(0); - vm.stopPrank(); } diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol b/packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol index 18461ec..d9c99e3 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol +++ b/packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol @@ -49,7 +49,7 @@ contract AdvancedERC721Checker is AdvancedChecker { /// @param subject Address to validate. /// @param evidence Encoded tokenId. /// @return Boolean indicating validation success. - function _checkPre(address subject, bytes[] calldata evidence) internal view override returns (bool) { + function _checkPre(address subject, bytes calldata evidence) internal view override returns (bool) { super._checkPre(subject, evidence); return baseERC721Checker.check(subject, evidence); @@ -59,7 +59,7 @@ contract AdvancedERC721Checker is AdvancedChecker { /// @param subject Address to validate. /// @param evidence Not used in this validation. /// @return Boolean indicating validation success. - function _checkMain(address subject, bytes[] calldata evidence) internal view override returns (bool) { + function _checkMain(address subject, bytes calldata evidence) internal view override returns (bool) { super._checkMain(subject, evidence); return signupNft.balanceOf(subject) >= minBalance; @@ -69,7 +69,7 @@ contract AdvancedERC721Checker is AdvancedChecker { /// @param subject Address to validate. /// @param evidence Not used in this validation. /// @return Boolean indicating validation success. - function _checkPost(address subject, bytes[] calldata evidence) internal view override returns (bool) { + function _checkPost(address subject, bytes calldata evidence) internal view override returns (bool) { super._checkPost(subject, evidence); return rewardNft.balanceOf(subject) == 0; diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol b/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol index 22ba2aa..cb9d91c 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol +++ b/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol @@ -58,12 +58,8 @@ contract AdvancedVoting { /// @dev Enforces the pre-check phase using the AdvancedPolicy contract. /// @param tokenId The ID of the NFT used to verify registration eligibility. function register(uint256 tokenId) external { - // Prepare evidence with the tokenId encoded as bytes. - bytes[] memory _evidence = new bytes[](1); - _evidence[0] = abi.encode(tokenId); - // Enforce the pre-check phase using the provided policy. - POLICY.enforce(msg.sender, _evidence, Check.PRE); + POLICY.enforce(msg.sender, abi.encode(tokenId), Check.PRE); // Track enforcement. registered[msg.sender] = true; @@ -82,12 +78,8 @@ contract AdvancedVoting { // Validate that the voting option is within the allowed range. if (option >= 2) revert InvalidOption(); - // Prepare evidence with the chosen option encoded as bytes. - bytes[] memory _evidence = new bytes[](1); - _evidence[0] = abi.encode(option); - // Enforce the main-check phase using the policy. - POLICY.enforce(msg.sender, _evidence, Check.MAIN); + POLICY.enforce(msg.sender, abi.encode(option), Check.MAIN); // Record the vote. hasVoted[msg.sender] = true; @@ -109,7 +101,7 @@ contract AdvancedVoting { if (isEligible[msg.sender]) revert AlreadyEligible(); // Enforce the post-check phase using the policy. - POLICY.enforce(msg.sender, new bytes[](1), Check.POST); + POLICY.enforce(msg.sender, abi.encode(), Check.POST); // Record eligibility. isEligible[msg.sender] = true; diff --git a/packages/contracts/contracts/src/test/base/BaseERC721Checker.sol b/packages/contracts/contracts/src/test/base/BaseERC721Checker.sol index dc1216f..47d73da 100644 --- a/packages/contracts/contracts/src/test/base/BaseERC721Checker.sol +++ b/packages/contracts/contracts/src/test/base/BaseERC721Checker.sol @@ -28,10 +28,10 @@ contract BaseERC721Checker is BaseChecker { /// @param subject Address to validate ownership for. /// @param evidence Encoded token ID used for validation. /// @return Boolean indicating whether the subject owns the token. - function _check(address subject, bytes[] calldata evidence) internal view override returns (bool) { + function _check(address subject, bytes calldata evidence) internal view override returns (bool) { super._check(subject, evidence); - uint256 tokenId = abi.decode(evidence[0], (uint256)); + uint256 tokenId = abi.decode(evidence, (uint256)); return nft.ownerOf(tokenId) == subject; } diff --git a/packages/contracts/contracts/src/test/base/BaseVoting.sol b/packages/contracts/contracts/src/test/base/BaseVoting.sol index fe98639..0d4a57d 100644 --- a/packages/contracts/contracts/src/test/base/BaseVoting.sol +++ b/packages/contracts/contracts/src/test/base/BaseVoting.sol @@ -44,12 +44,8 @@ contract BaseVoting { /// @dev Enforces ownership validation via the policy contract. /// @param tokenId Token ID of the NFT used for validation. function register(uint256 tokenId) external { - // Encode the token ID for policy validation. - bytes[] memory _evidence = new bytes[](1); - _evidence[0] = abi.encode(tokenId); - // Enforce NFT ownership validation. - POLICY.enforce(msg.sender, _evidence); + POLICY.enforce(msg.sender, abi.encode(tokenId)); // Track enforcement. registered[msg.sender] = true; diff --git a/packages/contracts/test/Advanced.test.ts b/packages/contracts/test/Advanced.test.ts index db7ea41..3d81665 100644 --- a/packages/contracts/test/Advanced.test.ts +++ b/packages/contracts/test/Advanced.test.ts @@ -154,7 +154,7 @@ describe("Advanced", () => { await loadFixture(deployAdvancedCheckerFixture) await expect( - advancedChecker.connect(target).check(subjectAddress, [invalidEncodedNFTId], 0) + advancedChecker.connect(target).check(subjectAddress, invalidEncodedNFTId, 0) ).to.be.revertedWithCustomError(rewardNft, "ERC721NonexistentToken") }) @@ -163,7 +163,7 @@ describe("Advanced", () => { await loadFixture(deployAdvancedCheckerFixture) expect( - await advancedChecker.connect(target).check(notOwnerAddress, [validEncodedNFTId], 0) + await advancedChecker.connect(target).check(notOwnerAddress, validEncodedNFTId, 0) ).to.be.equal(false) }) @@ -172,7 +172,7 @@ describe("Advanced", () => { await loadFixture(deployAdvancedCheckerFixture) expect( - await advancedChecker.connect(target).check(subjectAddress, [validEncodedNFTId], 0) + await advancedChecker.connect(target).check(subjectAddress, validEncodedNFTId, 0) ).to.be.equal(true) }) }) @@ -182,7 +182,7 @@ describe("Advanced", () => { await loadFixture(deployAdvancedCheckerFixture) expect( - await advancedChecker.connect(target).check(notOwnerAddress, [validEncodedNFTId], 1) + await advancedChecker.connect(target).check(notOwnerAddress, validEncodedNFTId, 1) ).to.be.equal(false) }) @@ -191,7 +191,7 @@ describe("Advanced", () => { await loadFixture(deployAdvancedCheckerFixture) expect( - await advancedChecker.connect(target).check(subjectAddress, [validEncodedNFTId], 1) + await advancedChecker.connect(target).check(subjectAddress, validEncodedNFTId, 1) ).to.be.equal(true) }) }) @@ -203,7 +203,7 @@ describe("Advanced", () => { await rewardNft.mint(subjectAddress) expect( - await advancedChecker.connect(target).check(subjectAddress, [invalidEncodedNFTId], 2) + await advancedChecker.connect(target).check(subjectAddress, invalidEncodedNFTId, 2) ).to.be.equal(false) }) @@ -212,7 +212,7 @@ describe("Advanced", () => { await loadFixture(deployAdvancedCheckerFixture) expect( - await advancedChecker.connect(target).check(subjectAddress, [validEncodedNFTId], 2) + await advancedChecker.connect(target).check(subjectAddress, validEncodedNFTId, 2) ).to.be.equal(true) }) }) @@ -471,7 +471,7 @@ describe("Advanced", () => { await advancedPolicy.setTarget(await target.getAddress()) await expect( - advancedPolicy.connect(subject).enforce(subjectAddress, [ZeroHash], 0) + advancedPolicy.connect(subject).enforce(subjectAddress, ZeroHash, 0) ).to.be.revertedWithCustomError(advancedPolicy, "TargetOnly") }) @@ -482,7 +482,7 @@ describe("Advanced", () => { await advancedPolicy.setTarget(await target.getAddress()) await expect( - advancedPolicy.connect(target).enforce(subjectAddress, [invalidEncodedNFTId], 0) + advancedPolicy.connect(target).enforce(subjectAddress, invalidEncodedNFTId, 0) ).to.be.revertedWithCustomError(iERC721Errors, "ERC721NonexistentToken") }) @@ -493,7 +493,7 @@ describe("Advanced", () => { await advancedPolicySkipped.setTarget(await target.getAddress()) await expect( - advancedPolicySkipped.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) + advancedPolicySkipped.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) ).to.be.revertedWithCustomError(advancedPolicySkipped, "CannotPreCheckWhenSkipped") }) @@ -504,7 +504,7 @@ describe("Advanced", () => { await advancedPolicy.setTarget(await target.getAddress()) expect( - advancedPolicy.connect(target).enforce(notOwnerAddress, [validEncodedNFTId], 0) + advancedPolicy.connect(target).enforce(notOwnerAddress, validEncodedNFTId, 0) ).to.be.revertedWithCustomError(advancedPolicy, "UnsuccessfulCheck") }) @@ -515,7 +515,7 @@ describe("Advanced", () => { await advancedPolicy.setTarget(targetAddress) - const tx = await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) + const tx = await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) const receipt = await tx.wait() const event = advancedPolicy.interface.parseLog( receipt?.logs[0] as unknown as { topics: string[]; data: string } @@ -531,7 +531,7 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.subject).to.eq(subjectAddress) expect(event.args.target).to.eq(targetAddress) - expect(event.args.evidence[0]).to.eq(validEncodedNFTId) + expect(event.args.evidence).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(0) }) }) @@ -544,7 +544,7 @@ describe("Advanced", () => { await advancedPolicy.setTarget(await target.getAddress()) expect( - advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) ).to.be.revertedWithCustomError(advancedPolicy, "PreCheckNotEnforced") }) @@ -553,10 +553,10 @@ describe("Advanced", () => { await loadFixture(deployAdvancedPolicyFixture) await advancedPolicy.setTarget(await target.getAddress()) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) expect( - advancedPolicy.connect(target).enforce(notOwnerAddress, [validEncodedNFTId], 1) + advancedPolicy.connect(target).enforce(notOwnerAddress, validEncodedNFTId, 1) ).to.be.revertedWithCustomError(advancedPolicy, "UnsuccessfulCheck") }) @@ -566,9 +566,9 @@ describe("Advanced", () => { const targetAddress = await target.getAddress() await advancedPolicy.setTarget(await target.getAddress()) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) - const tx = await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + const tx = await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) const receipt = await tx.wait() const event = advancedPolicy.interface.parseLog( receipt?.logs[0] as unknown as { topics: string[]; data: string } @@ -584,7 +584,7 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.subject).to.eq(subjectAddress) expect(event.args.target).to.eq(targetAddress) - expect(event.args.evidence[0]).to.eq(validEncodedNFTId) + expect(event.args.evidence).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(1) }) @@ -594,10 +594,10 @@ describe("Advanced", () => { const targetAddress = await target.getAddress() await advancedPolicy.setTarget(targetAddress) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) - const tx = await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + const tx = await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) const receipt = await tx.wait() const event = advancedPolicy.interface.parseLog( receipt?.logs[0] as unknown as { topics: string[]; data: string } @@ -613,7 +613,7 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.subject).to.eq(subjectAddress) expect(event.args.target).to.eq(targetAddress) - expect(event.args.evidence[0]).to.eq(validEncodedNFTId) + expect(event.args.evidence).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(1) }) }) @@ -626,13 +626,13 @@ describe("Advanced", () => { await advancedPolicy.setTarget(await target.getAddress()) expect( - advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 2) + advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 2) ).to.be.revertedWithCustomError(advancedPolicy, "PreCheckNotEnforced") - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) expect( - advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 2) + advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 2) ).to.be.revertedWithCustomError(advancedPolicy, "MainCheckNotEnforced") }) @@ -641,11 +641,11 @@ describe("Advanced", () => { await loadFixture(deployAdvancedPolicyFixture) await advancedPolicy.setTarget(await target.getAddress()) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) await expect( - advancedPolicy.connect(subject).enforce(subjectAddress, [ZeroHash], 2) + advancedPolicy.connect(subject).enforce(subjectAddress, ZeroHash, 2) ).to.be.revertedWithCustomError(advancedPolicy, "TargetOnly") }) @@ -660,13 +660,13 @@ describe("Advanced", () => { } = await loadFixture(deployAdvancedPolicyFixture) await advancedPolicy.setTarget(await target.getAddress()) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) await rewardNft.mint(subjectAddress) await expect( - advancedPolicy.connect(target).enforce(subjectAddress, [invalidEncodedNFTId], 2) + advancedPolicy.connect(target).enforce(subjectAddress, invalidEncodedNFTId, 2) ).to.be.revertedWithCustomError(advancedPolicy, "UnsuccessfulCheck") }) @@ -675,10 +675,10 @@ describe("Advanced", () => { await loadFixture(deployAdvancedPolicyFixture) await advancedPolicySkipped.setTarget(await target.getAddress()) - await advancedPolicySkipped.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + await advancedPolicySkipped.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) await expect( - advancedPolicySkipped.connect(target).enforce(subjectAddress, [validEncodedNFTId], 2) + advancedPolicySkipped.connect(target).enforce(subjectAddress, validEncodedNFTId, 2) ).to.be.revertedWithCustomError(advancedPolicySkipped, "CannotPostCheckWhenSkipped") }) @@ -687,11 +687,11 @@ describe("Advanced", () => { await loadFixture(deployAdvancedPolicyFixture) await advancedPolicy.setTarget(await target.getAddress()) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) expect( - advancedPolicy.connect(target).enforce(notOwnerAddress, [validEncodedNFTId], 2) + advancedPolicy.connect(target).enforce(notOwnerAddress, validEncodedNFTId, 2) ).to.be.revertedWithCustomError(advancedPolicy, "UnsuccessfulCheck") }) @@ -701,10 +701,10 @@ describe("Advanced", () => { const targetAddress = await target.getAddress() await advancedPolicy.setTarget(targetAddress) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 0) - await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 1) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 0) + await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 1) - const tx = await advancedPolicy.connect(target).enforce(subjectAddress, [validEncodedNFTId], 2) + const tx = await advancedPolicy.connect(target).enforce(subjectAddress, validEncodedNFTId, 2) const receipt = await tx.wait() const event = advancedPolicy.interface.parseLog( receipt?.logs[0] as unknown as { topics: string[]; data: string } @@ -720,7 +720,7 @@ describe("Advanced", () => { expect(receipt?.status).to.eq(1) expect(event.args.subject).to.eq(subjectAddress) expect(event.args.target).to.eq(targetAddress) - expect(event.args.evidence[0]).to.eq(validEncodedNFTId) + expect(event.args.evidence).to.eq(validEncodedNFTId) expect(event.args.checkType).to.eq(2) }) }) diff --git a/packages/contracts/test/Base.test.ts b/packages/contracts/test/Base.test.ts index 48717fe..a9cab6e 100644 --- a/packages/contracts/test/Base.test.ts +++ b/packages/contracts/test/Base.test.ts @@ -103,7 +103,7 @@ describe("Base", () => { await loadFixture(deployBaseCheckerFixture) await expect( - checker.connect(target).check(subjectAddress, [invalidEncodedNFTId]) + checker.connect(target).check(subjectAddress, invalidEncodedNFTId) ).to.be.revertedWithCustomError(nft, "ERC721NonexistentToken") }) @@ -111,14 +111,14 @@ describe("Base", () => { const { checker, target, notOwnerAddress, validEncodedNFTId } = await loadFixture(deployBaseCheckerFixture) - expect(await checker.connect(target).check(notOwnerAddress, [validEncodedNFTId])).to.be.equal(false) + expect(await checker.connect(target).check(notOwnerAddress, validEncodedNFTId)).to.be.equal(false) }) it("succeeds when valid", async () => { const { checker, target, subjectAddress, validEncodedNFTId } = await loadFixture(deployBaseCheckerFixture) - expect(await checker.connect(target).check(subjectAddress, [validEncodedNFTId])).to.be.equal(true) + expect(await checker.connect(target).check(subjectAddress, validEncodedNFTId)).to.be.equal(true) }) }) }) @@ -285,7 +285,7 @@ describe("Base", () => { await policy.setTarget(await target.getAddress()) - await expect(policy.connect(subject).enforce(subjectAddress, [ZeroHash])).to.be.revertedWithCustomError( + await expect(policy.connect(subject).enforce(subjectAddress, ZeroHash)).to.be.revertedWithCustomError( policy, "TargetOnly" ) @@ -298,7 +298,7 @@ describe("Base", () => { await policy.setTarget(await target.getAddress()) await expect( - policy.connect(target).enforce(subjectAddress, [invalidEncodedNFTId]) + policy.connect(target).enforce(subjectAddress, invalidEncodedNFTId) ).to.be.revertedWithCustomError(iERC721Errors, "ERC721NonexistentToken") }) @@ -309,7 +309,7 @@ describe("Base", () => { await policy.setTarget(await target.getAddress()) expect( - policy.connect(target).enforce(notOwnerAddress, [validEncodedNFTId]) + policy.connect(target).enforce(notOwnerAddress, validEncodedNFTId) ).to.be.revertedWithCustomError(policy, "UnsuccessfulCheck") }) @@ -319,7 +319,7 @@ describe("Base", () => { await policy.setTarget(await target.getAddress()) - const tx = await policy.connect(target).enforce(subjectAddress, [validEncodedNFTId]) + const tx = await policy.connect(target).enforce(subjectAddress, validEncodedNFTId) const receipt = await tx.wait() const event = policy.interface.parseLog( receipt?.logs[0] as unknown as { topics: string[]; data: string } @@ -334,7 +334,7 @@ describe("Base", () => { expect(receipt?.status).to.eq(1) expect(event.args.subject).to.eq(subjectAddress) expect(event.args.target).to.eq(targetAddress) - expect(event.args.evidence[0]).to.eq(validEncodedNFTId) + expect(event.args.evidence).to.eq(validEncodedNFTId) }) }) }) From 503afb254f9364a62044754fa3843642588c72ae Mon Sep 17 00:00:00 2001 From: 0xjei Date: Thu, 6 Feb 2025 21:41:06 +0100 Subject: [PATCH 3/4] refactor(contracts): removed src/core subfolders --- .yarnrc.yml | 2 ++ package.json | 9 +++++---- .../{src/core => }/checker/AdvancedChecker.sol | 0 .../contracts/{src/core => }/checker/BaseChecker.sol | 0 .../{src/core => }/interfaces/IAdvancedChecker.sol | 0 .../{src/core => }/interfaces/IAdvancedPolicy.sol | 0 .../{src/core => }/interfaces/IBaseChecker.sol | 0 .../{src/core => }/interfaces/IBasePolicy.sol | 0 .../contracts/{src/core => }/interfaces/IClone.sol | 0 .../contracts/{src/core => }/interfaces/IFactory.sol | 0 .../contracts/{src/core => }/interfaces/IPolicy.sol | 0 packages/contracts/contracts/package.json | 1 - .../{src/core => }/policy/AdvancedPolicy.sol | 0 .../contracts/{src/core => }/policy/BasePolicy.sol | 0 .../contracts/{src/core => }/policy/Policy.sol | 0 .../contracts/{src/core => }/proxy/Clone.sol | 0 .../contracts/{src/core => }/proxy/Factory.sol | 0 .../contracts/contracts/{src => }/test/Advanced.t.sol | 8 ++++---- .../contracts/contracts/{src => }/test/Base.t.sol | 4 ++-- .../{src => }/test/advanced/AdvancedERC721Checker.sol | 2 +- .../test/advanced/AdvancedERC721CheckerFactory.sol | 2 +- .../{src => }/test/advanced/AdvancedERC721Policy.sol | 2 +- .../test/advanced/AdvancedERC721PolicyFactory.sol | 2 +- .../{src => }/test/advanced/AdvancedVoting.sol | 4 ++-- .../{src => }/test/base/BaseERC721Checker.sol | 2 +- .../{src => }/test/base/BaseERC721CheckerFactory.sol | 2 +- .../{src => }/test/base/BaseERC721Policy.sol | 2 +- .../{src => }/test/base/BaseERC721PolicyFactory.sol | 2 +- .../contracts/{src => }/test/base/BaseVoting.sol | 0 .../contracts/contracts/{src => }/test/utils/NFT.sol | 0 packages/contracts/foundry.toml | 7 ++++--- packages/contracts/hardhat.config.ts | 2 +- packages/contracts/package.json | 3 --- yarn.lock | 11 +---------- 34 files changed, 29 insertions(+), 38 deletions(-) rename packages/contracts/contracts/{src/core => }/checker/AdvancedChecker.sol (100%) rename packages/contracts/contracts/{src/core => }/checker/BaseChecker.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IAdvancedChecker.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IAdvancedPolicy.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IBaseChecker.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IBasePolicy.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IClone.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IFactory.sol (100%) rename packages/contracts/contracts/{src/core => }/interfaces/IPolicy.sol (100%) rename packages/contracts/contracts/{src/core => }/policy/AdvancedPolicy.sol (100%) rename packages/contracts/contracts/{src/core => }/policy/BasePolicy.sol (100%) rename packages/contracts/contracts/{src/core => }/policy/Policy.sol (100%) rename packages/contracts/contracts/{src/core => }/proxy/Clone.sol (100%) rename packages/contracts/contracts/{src/core => }/proxy/Factory.sol (100%) rename packages/contracts/contracts/{src => }/test/Advanced.t.sol (98%) rename packages/contracts/contracts/{src => }/test/Base.t.sol (99%) rename packages/contracts/contracts/{src => }/test/advanced/AdvancedERC721Checker.sol (97%) rename packages/contracts/contracts/{src => }/test/advanced/AdvancedERC721CheckerFactory.sol (96%) rename packages/contracts/contracts/{src => }/test/advanced/AdvancedERC721Policy.sol (87%) rename packages/contracts/contracts/{src => }/test/advanced/AdvancedERC721PolicyFactory.sol (95%) rename packages/contracts/contracts/{src => }/test/advanced/AdvancedVoting.sol (96%) rename packages/contracts/contracts/{src => }/test/base/BaseERC721Checker.sol (95%) rename packages/contracts/contracts/{src => }/test/base/BaseERC721CheckerFactory.sol (95%) rename packages/contracts/contracts/{src => }/test/base/BaseERC721Policy.sol (89%) rename packages/contracts/contracts/{src => }/test/base/BaseERC721PolicyFactory.sol (95%) rename packages/contracts/contracts/{src => }/test/base/BaseVoting.sol (100%) rename packages/contracts/contracts/{src => }/test/utils/NFT.sol (100%) diff --git a/.yarnrc.yml b/.yarnrc.yml index e6c5ed7..74d18f5 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -6,4 +6,6 @@ enableGlobalCache: false nodeLinker: node-modules +nmHoistingLimits: workspaces + yarnPath: .yarn/releases/yarn-4.6.0.cjs diff --git a/package.json b/package.json index f37a07a..a7195b2 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,11 @@ "private": true, "packageManager": "yarn@4.6.0", "workspaces": [ - "packages/*", - "packages/contracts/contracts" + "packages/*" ], + "installConfig": { + "hoistingLimits": "workspaces" + }, "devDependencies": { "@commitlint/cli": "^19.7.1", "@commitlint/config-conventional": "^19.7.1", @@ -57,6 +59,5 @@ "remove:stable-version-field": "ts-node scripts/remove-stable-version-field.ts && yarn format:write", "precommit": "lint-staged", "postinstall": "husky && git config --local core.editor cat" - }, - "version": "" + } } diff --git a/packages/contracts/contracts/src/core/checker/AdvancedChecker.sol b/packages/contracts/contracts/checker/AdvancedChecker.sol similarity index 100% rename from packages/contracts/contracts/src/core/checker/AdvancedChecker.sol rename to packages/contracts/contracts/checker/AdvancedChecker.sol diff --git a/packages/contracts/contracts/src/core/checker/BaseChecker.sol b/packages/contracts/contracts/checker/BaseChecker.sol similarity index 100% rename from packages/contracts/contracts/src/core/checker/BaseChecker.sol rename to packages/contracts/contracts/checker/BaseChecker.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IAdvancedChecker.sol b/packages/contracts/contracts/interfaces/IAdvancedChecker.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IAdvancedChecker.sol rename to packages/contracts/contracts/interfaces/IAdvancedChecker.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IAdvancedPolicy.sol b/packages/contracts/contracts/interfaces/IAdvancedPolicy.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IAdvancedPolicy.sol rename to packages/contracts/contracts/interfaces/IAdvancedPolicy.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IBaseChecker.sol b/packages/contracts/contracts/interfaces/IBaseChecker.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IBaseChecker.sol rename to packages/contracts/contracts/interfaces/IBaseChecker.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IBasePolicy.sol b/packages/contracts/contracts/interfaces/IBasePolicy.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IBasePolicy.sol rename to packages/contracts/contracts/interfaces/IBasePolicy.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IClone.sol b/packages/contracts/contracts/interfaces/IClone.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IClone.sol rename to packages/contracts/contracts/interfaces/IClone.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IFactory.sol b/packages/contracts/contracts/interfaces/IFactory.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IFactory.sol rename to packages/contracts/contracts/interfaces/IFactory.sol diff --git a/packages/contracts/contracts/src/core/interfaces/IPolicy.sol b/packages/contracts/contracts/interfaces/IPolicy.sol similarity index 100% rename from packages/contracts/contracts/src/core/interfaces/IPolicy.sol rename to packages/contracts/contracts/interfaces/IPolicy.sol diff --git a/packages/contracts/contracts/package.json b/packages/contracts/contracts/package.json index 87c7524..4a67ea7 100644 --- a/packages/contracts/contracts/package.json +++ b/packages/contracts/contracts/package.json @@ -25,7 +25,6 @@ "publishConfig": { "access": "public" }, - "packageManager": "yarn@4.5.0", "dependencies": { "@openzeppelin/contracts": "^5.2.0", "solady": "^0.1.4" diff --git a/packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol b/packages/contracts/contracts/policy/AdvancedPolicy.sol similarity index 100% rename from packages/contracts/contracts/src/core/policy/AdvancedPolicy.sol rename to packages/contracts/contracts/policy/AdvancedPolicy.sol diff --git a/packages/contracts/contracts/src/core/policy/BasePolicy.sol b/packages/contracts/contracts/policy/BasePolicy.sol similarity index 100% rename from packages/contracts/contracts/src/core/policy/BasePolicy.sol rename to packages/contracts/contracts/policy/BasePolicy.sol diff --git a/packages/contracts/contracts/src/core/policy/Policy.sol b/packages/contracts/contracts/policy/Policy.sol similarity index 100% rename from packages/contracts/contracts/src/core/policy/Policy.sol rename to packages/contracts/contracts/policy/Policy.sol diff --git a/packages/contracts/contracts/src/core/proxy/Clone.sol b/packages/contracts/contracts/proxy/Clone.sol similarity index 100% rename from packages/contracts/contracts/src/core/proxy/Clone.sol rename to packages/contracts/contracts/proxy/Clone.sol diff --git a/packages/contracts/contracts/src/core/proxy/Factory.sol b/packages/contracts/contracts/proxy/Factory.sol similarity index 100% rename from packages/contracts/contracts/src/core/proxy/Factory.sol rename to packages/contracts/contracts/proxy/Factory.sol diff --git a/packages/contracts/contracts/src/test/Advanced.t.sol b/packages/contracts/contracts/test/Advanced.t.sol similarity index 98% rename from packages/contracts/contracts/src/test/Advanced.t.sol rename to packages/contracts/contracts/test/Advanced.t.sol index 54ee31b..e35f28e 100644 --- a/packages/contracts/contracts/src/test/Advanced.t.sol +++ b/packages/contracts/contracts/test/Advanced.t.sol @@ -10,12 +10,12 @@ import {AdvancedERC721CheckerFactory} from "./advanced/AdvancedERC721CheckerFact import {AdvancedERC721Policy} from "./advanced/AdvancedERC721Policy.sol"; import {AdvancedERC721PolicyFactory} from "./advanced/AdvancedERC721PolicyFactory.sol"; import {AdvancedVoting} from "./advanced/AdvancedVoting.sol"; -import {IPolicy} from "../core/interfaces/IPolicy.sol"; +import {IPolicy} from "../interfaces/IPolicy.sol"; import {IERC721Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {Check} from "../core/interfaces/IAdvancedChecker.sol"; -import {IClone} from "../core/interfaces/IClone.sol"; -import {IAdvancedPolicy} from "../core/interfaces/IAdvancedPolicy.sol"; +import {Check} from "../interfaces/IAdvancedChecker.sol"; +import {IClone} from "../interfaces/IClone.sol"; +import {IAdvancedPolicy} from "../interfaces/IAdvancedPolicy.sol"; contract AdvancedChecker is Test { event CloneDeployed(address indexed clone); diff --git a/packages/contracts/contracts/src/test/Base.t.sol b/packages/contracts/contracts/test/Base.t.sol similarity index 99% rename from packages/contracts/contracts/src/test/Base.t.sol rename to packages/contracts/contracts/test/Base.t.sol index 1c87eb9..136f306 100644 --- a/packages/contracts/contracts/src/test/Base.t.sol +++ b/packages/contracts/contracts/test/Base.t.sol @@ -8,8 +8,8 @@ import {BaseERC721CheckerFactory} from "./base/BaseERC721CheckerFactory.sol"; import {BaseERC721PolicyFactory} from "./base/BaseERC721PolicyFactory.sol"; import {BaseERC721Policy} from "./base/BaseERC721Policy.sol"; import {BaseVoting} from "./base/BaseVoting.sol"; -import {IPolicy} from "../core/interfaces/IPolicy.sol"; -import {IClone} from "../core/interfaces/IClone.sol"; +import {IPolicy} from "../interfaces/IPolicy.sol"; +import {IClone} from "../interfaces/IClone.sol"; import {IERC721Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol b/packages/contracts/contracts/test/advanced/AdvancedERC721Checker.sol similarity index 97% rename from packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol rename to packages/contracts/contracts/test/advanced/AdvancedERC721Checker.sol index d9c99e3..1308299 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedERC721Checker.sol +++ b/packages/contracts/contracts/test/advanced/AdvancedERC721Checker.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; -import {AdvancedChecker} from "../../core/checker/AdvancedChecker.sol"; +import {AdvancedChecker} from "../../checker/AdvancedChecker.sol"; import {BaseERC721Checker} from "../base/BaseERC721Checker.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedERC721CheckerFactory.sol b/packages/contracts/contracts/test/advanced/AdvancedERC721CheckerFactory.sol similarity index 96% rename from packages/contracts/contracts/src/test/advanced/AdvancedERC721CheckerFactory.sol rename to packages/contracts/contracts/test/advanced/AdvancedERC721CheckerFactory.sol index 89c68e8..cb1cf6c 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedERC721CheckerFactory.sol +++ b/packages/contracts/contracts/test/advanced/AdvancedERC721CheckerFactory.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import {AdvancedERC721Checker} from "./AdvancedERC721Checker.sol"; -import {Factory} from "../../core/proxy/Factory.sol"; +import {Factory} from "../../proxy/Factory.sol"; /// @title AdvancedERC721CheckerFactory /// @notice Factory for deploying minimal proxy instances of AdvancedERC721Checker. diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedERC721Policy.sol b/packages/contracts/contracts/test/advanced/AdvancedERC721Policy.sol similarity index 87% rename from packages/contracts/contracts/src/test/advanced/AdvancedERC721Policy.sol rename to packages/contracts/contracts/test/advanced/AdvancedERC721Policy.sol index 84bb645..02b5083 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedERC721Policy.sol +++ b/packages/contracts/contracts/test/advanced/AdvancedERC721Policy.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; -import {AdvancedPolicy} from "../../core/policy/AdvancedPolicy.sol"; +import {AdvancedPolicy} from "../../policy/AdvancedPolicy.sol"; /// @title AdvancedERC721Policy /// @notice Three-phase policy contract for ERC721 validation. diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol b/packages/contracts/contracts/test/advanced/AdvancedERC721PolicyFactory.sol similarity index 95% rename from packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol rename to packages/contracts/contracts/test/advanced/AdvancedERC721PolicyFactory.sol index f67a2c2..b078912 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedERC721PolicyFactory.sol +++ b/packages/contracts/contracts/test/advanced/AdvancedERC721PolicyFactory.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import {AdvancedERC721Policy} from "./AdvancedERC721Policy.sol"; -import {Factory} from "../../core/proxy/Factory.sol"; +import {Factory} from "../../proxy/Factory.sol"; /// @title AdvancedERC721PolicyFactory /// @notice Factory for deploying minimal proxy instances of AdvancedERC721Policy. diff --git a/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol b/packages/contracts/contracts/test/advanced/AdvancedVoting.sol similarity index 96% rename from packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol rename to packages/contracts/contracts/test/advanced/AdvancedVoting.sol index cb9d91c..c9d6e7a 100644 --- a/packages/contracts/contracts/src/test/advanced/AdvancedVoting.sol +++ b/packages/contracts/contracts/test/advanced/AdvancedVoting.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; -import {AdvancedPolicy} from "../../core/policy/AdvancedPolicy.sol"; -import {Check} from "../../core/interfaces/IAdvancedPolicy.sol"; +import {AdvancedPolicy} from "../../policy/AdvancedPolicy.sol"; +import {Check} from "../../interfaces/IAdvancedPolicy.sol"; /// @title AdvancedVoting /// @notice Multi-phase governance system with NFT-based validation. diff --git a/packages/contracts/contracts/src/test/base/BaseERC721Checker.sol b/packages/contracts/contracts/test/base/BaseERC721Checker.sol similarity index 95% rename from packages/contracts/contracts/src/test/base/BaseERC721Checker.sol rename to packages/contracts/contracts/test/base/BaseERC721Checker.sol index 47d73da..bb52e17 100644 --- a/packages/contracts/contracts/src/test/base/BaseERC721Checker.sol +++ b/packages/contracts/contracts/test/base/BaseERC721Checker.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; -import {BaseChecker} from "../../core/checker/BaseChecker.sol"; +import {BaseChecker} from "../../checker/BaseChecker.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; /// @title BaseERC721Checker diff --git a/packages/contracts/contracts/src/test/base/BaseERC721CheckerFactory.sol b/packages/contracts/contracts/test/base/BaseERC721CheckerFactory.sol similarity index 95% rename from packages/contracts/contracts/src/test/base/BaseERC721CheckerFactory.sol rename to packages/contracts/contracts/test/base/BaseERC721CheckerFactory.sol index 2b50829..0aacd66 100644 --- a/packages/contracts/contracts/src/test/base/BaseERC721CheckerFactory.sol +++ b/packages/contracts/contracts/test/base/BaseERC721CheckerFactory.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import {BaseERC721Checker} from "./BaseERC721Checker.sol"; -import {Factory} from "../../core/proxy/Factory.sol"; +import {Factory} from "../../proxy/Factory.sol"; /// @title BaseERC721CheckerFactory /// @notice Factory contract for deploying minimal proxy instances of BaseERC721Checker. diff --git a/packages/contracts/contracts/src/test/base/BaseERC721Policy.sol b/packages/contracts/contracts/test/base/BaseERC721Policy.sol similarity index 89% rename from packages/contracts/contracts/src/test/base/BaseERC721Policy.sol rename to packages/contracts/contracts/test/base/BaseERC721Policy.sol index 591c598..bb8bfdf 100644 --- a/packages/contracts/contracts/src/test/base/BaseERC721Policy.sol +++ b/packages/contracts/contracts/test/base/BaseERC721Policy.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; -import {BasePolicy} from "../../core/policy/BasePolicy.sol"; +import {BasePolicy} from "../../policy/BasePolicy.sol"; /// @title BaseERC721Policy /// @notice Policy contract enforcing NFT-based validation. diff --git a/packages/contracts/contracts/src/test/base/BaseERC721PolicyFactory.sol b/packages/contracts/contracts/test/base/BaseERC721PolicyFactory.sol similarity index 95% rename from packages/contracts/contracts/src/test/base/BaseERC721PolicyFactory.sol rename to packages/contracts/contracts/test/base/BaseERC721PolicyFactory.sol index 916bd49..1a9c1aa 100644 --- a/packages/contracts/contracts/src/test/base/BaseERC721PolicyFactory.sol +++ b/packages/contracts/contracts/test/base/BaseERC721PolicyFactory.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import {BaseERC721Policy} from "./BaseERC721Policy.sol"; -import {Factory} from "../../core/proxy/Factory.sol"; +import {Factory} from "../../proxy/Factory.sol"; /// @title BaseERC721PolicyFactory /// @notice Factory contract for deploying minimal proxy instances of BaseERC721Policy. diff --git a/packages/contracts/contracts/src/test/base/BaseVoting.sol b/packages/contracts/contracts/test/base/BaseVoting.sol similarity index 100% rename from packages/contracts/contracts/src/test/base/BaseVoting.sol rename to packages/contracts/contracts/test/base/BaseVoting.sol diff --git a/packages/contracts/contracts/src/test/utils/NFT.sol b/packages/contracts/contracts/test/utils/NFT.sol similarity index 100% rename from packages/contracts/contracts/src/test/utils/NFT.sol rename to packages/contracts/contracts/test/utils/NFT.sol diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index cf77709..b917d0f 100644 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -2,10 +2,11 @@ # core libs = ['node_modules'] cache_path = 'cache_forge' - test = 'contracts/src/test' - src = 'contracts/src' + test = 'test' + src = 'contracts' out = 'out' - script = "contracts/scripts" + script = "scripts" + ignore_paths = ["node_modules"] # sol auto_detect_solc = false diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 8d25654..6fc602e 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -21,7 +21,7 @@ const config: HardhatUserConfig = { } }, paths: { - sources: "./contracts/src", + sources: "./contracts", tests: "./test", cache: "./cache-hh", artifacts: "./artifacts" diff --git a/packages/contracts/package.json b/packages/contracts/package.json index b110992..a9ce02e 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,9 +1,6 @@ { "name": "excubiae-contracts", "private": true, - "installConfig": { - "hoistingLimits": "dependencies" - }, "scripts": { "start:hardhat": "hardhat node", "start:anvil": "anvil", diff --git a/yarn.lock b/yarn.lock index e3a5abb..ee70002 100644 --- a/yarn.lock +++ b/yarn.lock @@ -725,15 +725,6 @@ __metadata: languageName: node linkType: hard -"@excubiae/contracts@workspace:packages/contracts/contracts": - version: 0.0.0-use.local - resolution: "@excubiae/contracts@workspace:packages/contracts/contracts" - dependencies: - "@openzeppelin/contracts": "npm:^5.2.0" - solady: "npm:^0.1.4" - languageName: unknown - linkType: soft - "@fastify/busboy@npm:^2.0.0": version: 2.1.1 resolution: "@fastify/busboy@npm:2.1.1" @@ -8690,7 +8681,7 @@ __metadata: languageName: node linkType: hard -"solady@npm:0.1.4, solady@npm:^0.1.4": +"solady@npm:0.1.4": version: 0.1.4 resolution: "solady@npm:0.1.4" checksum: 10/5e316f27d236984704cb622cb673fd5ac336c18f8ea671954ce27a224c7950e9abb7dfac8e02050894003031f8aba5c95ede0d2afc7ae41b67351805399b1c30 From 873deab4c821250c97bc3a8b2bdebaee67642304 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Thu, 6 Feb 2025 21:48:37 +0100 Subject: [PATCH 4/4] refactor(contracts): update local compiler to 0.8.28 --- packages/contracts/foundry.toml | 2 +- packages/contracts/hardhat.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index b917d0f..eddf7da 100644 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -14,7 +14,7 @@ gas_reports = ["*"] optimizer = true optimizer_runs = 200_000 - solc = "0.8.20" + solc = "0.8.28" [rpc_endpoints] sepolia = "https://rpc2.sepolia.org" diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 6fc602e..a4bc25d 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -12,7 +12,7 @@ const backendPrivateKey = process.env.BACKEND_PRIVATE_KEY const config: HardhatUserConfig = { solidity: { - version: "0.8.20", + version: "0.8.28", settings: { optimizer: { enabled: true,