diff --git a/contracts/modules/reference/DegreesOfSeparationReferenceModule.sol b/contracts/modules/reference/DegreesOfSeparationReferenceModule.sol index 5704419..183afd8 100644 --- a/contracts/modules/reference/DegreesOfSeparationReferenceModule.sol +++ b/contracts/modules/reference/DegreesOfSeparationReferenceModule.sol @@ -18,8 +18,9 @@ import {FollowValidationLib} from 'contracts/modules/libraries/FollowValidationL * @param quotesRestricted Indicates if the quote operation is restricted or open to everyone. * @param mirrorsRestricted Indicates if the mirror operation is restricted or open to everyone. * @param degreesOfSeparation The max degrees of separation allowed for restricted operations. - * @param sourceProfile The ID of the profile from where the follower path should be started. Expected to be set as the - * author of the root publication. + * @param sourceProfile The ID of the profile from where the follower path should be started. Usually it will match the + * `originalAuthorProfile`. + * @param originalAuthorProfile Original author of the Post or Quote when the degrees restriction was first applied. */ struct ModuleConfig { bool setUp; @@ -27,7 +28,8 @@ struct ModuleConfig { bool quotesRestricted; bool mirrorsRestricted; uint8 degreesOfSeparation; - uint128 sourceProfile; + uint96 sourceProfile; + uint96 originalAuthorProfile; } /** @@ -64,7 +66,7 @@ contract DegreesOfSeparationReferenceModule is HubRestricted, IReferenceModule { * - bool quotesRestricted: Indicates if the quote operation is restricted or open to everyone. * - bool mirrorsRestricted: Indicates if the mirror operation is restricted or open to everyone. * - uint8 degreesOfSeparation: The max degrees of separation allowed for restricted operations. - * - uint128 sourceProfile The ID of the profile from where the follower path should be started. Expected to be set + * - uint96 sourceProfile: The ID of the profile from where the follower path should be started. Expected to be set * as the author of the root publication. */ function initializeReferenceModule( @@ -78,21 +80,36 @@ contract DegreesOfSeparationReferenceModule is HubRestricted, IReferenceModule { bool quotesRestricted, bool mirrorsRestricted, uint8 degreesOfSeparation, - uint128 sourceProfile - ) = abi.decode(data, (bool, bool, bool, uint8, uint128)); + uint96 sourceProfile + ) = abi.decode(data, (bool, bool, bool, uint8, uint96)); if (degreesOfSeparation > MAX_DEGREES_OF_SEPARATION) { revert InvalidDegreesOfSeparation(); } if (!IERC721Timestamped(HUB).exists(sourceProfile)) { revert Errors.TokenDoesNotExist(); } + + uint96 originalAuthorProfile; + Types.PublicationMemory memory pub = ILensHub(HUB).getPublication(profileId, pubId); + if (pub.pubType == Types.PublicationType.Comment) { + ModuleConfig memory parentConfig = _moduleConfig[pub.pointedProfileId][pub.pointedPubId]; + if (!parentConfig.setUp) { + // Comments cannot restrict degrees of separation, unless the pointed publication has it enabled too. + revert OperationDisabled(); + } + originalAuthorProfile = parentConfig.originalAuthorProfile; + } else { + originalAuthorProfile = uint96(profileId); + } + _moduleConfig[profileId][pubId] = ModuleConfig( true, commentsRestricted, quotesRestricted, mirrorsRestricted, degreesOfSeparation, - sourceProfile + sourceProfile, + originalAuthorProfile ); return data; } @@ -114,6 +131,7 @@ contract DegreesOfSeparationReferenceModule is HubRestricted, IReferenceModule { if (config.commentsRestricted) { _validateDegreesOfSeparationRestriction({ sourceProfile: config.sourceProfile, + originalAuthorProfile: config.originalAuthorProfile, profileId: processCommentParams.profileId, degreesOfSeparation: config.degreesOfSeparation, profilePath: abi.decode(processCommentParams.data, (uint256[])) @@ -136,13 +154,15 @@ contract DegreesOfSeparationReferenceModule is HubRestricted, IReferenceModule { function processQuote( Types.ProcessQuoteParams calldata processQuoteParams ) external view override onlyHub returns (bytes memory) { - if (_moduleConfig[processQuoteParams.pointedProfileId][processQuoteParams.pointedPubId].quotesRestricted) { + ModuleConfig memory config = _moduleConfig[processQuoteParams.pointedProfileId][ + processQuoteParams.pointedPubId + ]; + if (config.quotesRestricted) { _validateDegreesOfSeparationRestriction({ - sourceProfile: _moduleConfig[processQuoteParams.pointedProfileId][processQuoteParams.pointedPubId] - .sourceProfile, + sourceProfile: config.sourceProfile, + originalAuthorProfile: config.originalAuthorProfile, profileId: processQuoteParams.profileId, - degreesOfSeparation: _moduleConfig[processQuoteParams.pointedProfileId][processQuoteParams.pointedPubId] - .degreesOfSeparation, + degreesOfSeparation: config.degreesOfSeparation, profilePath: abi.decode(processQuoteParams.data, (uint256[])) }); } @@ -159,14 +179,15 @@ contract DegreesOfSeparationReferenceModule is HubRestricted, IReferenceModule { function processMirror( Types.ProcessMirrorParams calldata processMirrorParams ) external view override onlyHub returns (bytes memory) { - if (_moduleConfig[processMirrorParams.pointedProfileId][processMirrorParams.pointedPubId].mirrorsRestricted) { + ModuleConfig memory config = _moduleConfig[processMirrorParams.pointedProfileId][ + processMirrorParams.pointedPubId + ]; + if (config.mirrorsRestricted) { _validateDegreesOfSeparationRestriction({ - sourceProfile: _moduleConfig[processMirrorParams.pointedProfileId][processMirrorParams.pointedPubId] - .sourceProfile, + sourceProfile: config.sourceProfile, + originalAuthorProfile: config.originalAuthorProfile, profileId: processMirrorParams.profileId, - degreesOfSeparation: _moduleConfig[processMirrorParams.pointedProfileId][ - processMirrorParams.pointedPubId - ].degreesOfSeparation, + degreesOfSeparation: config.degreesOfSeparation, profilePath: abi.decode(processMirrorParams.data, (uint256[])) }); } @@ -203,20 +224,24 @@ contract DegreesOfSeparationReferenceModule is HubRestricted, IReferenceModule { */ function _validateDegreesOfSeparationRestriction( uint256 sourceProfile, + uint256 originalAuthorProfile, uint256 profileId, uint8 degreesOfSeparation, uint256[] memory profilePath ) internal view { + // Unrestricted if the profile authoring the publication is the source or the original author profile. + if (profileId == sourceProfile || profileId == originalAuthorProfile) { + return; + } + + // Here we only have cases where the source profile is not the same as the profile authoring the new publication. if (degreesOfSeparation == 0) { // If `degreesOfSeparation` was set to zero, only `sourceProfile` is allowed to interact. - if (profileId == sourceProfile) { - return; - } else { - revert OperationDisabled(); - } + revert OperationDisabled(); } else if (profilePath.length > degreesOfSeparation - 1) { revert ProfilePathExceedsDegreesOfSeparation(); } + if (profilePath.length > 0) { // Checks that the source profile follows the first profile in the path. // In the previous notation: sourceProfile --> path[0] diff --git a/test/modules/reference/DegreesOfSeparationReferenceModule.t.sol b/test/modules/reference/DegreesOfSeparationReferenceModule.t.sol index c6763e0..4d87f05 100644 --- a/test/modules/reference/DegreesOfSeparationReferenceModule.t.sol +++ b/test/modules/reference/DegreesOfSeparationReferenceModule.t.sol @@ -49,7 +49,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { bool quotesRestricted, bool mirrorsRestricted, uint8 degreesOfSeparation, - uint128 sourceProfile + uint96 sourceProfile ) private pure returns (bytes memory) { return abi.encode(commentsRestricted, quotesRestricted, mirrorsRestricted, degreesOfSeparation, sourceProfile); } @@ -70,7 +70,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); } @@ -90,7 +90,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: unallowedDegreesValue, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); } @@ -104,7 +104,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { module.initializeReferenceModule(originalPublisher.profileId, 1, originalPublisher.owner, wrongData); } - function testCannotInitialize_IfSourceProfileDoesNotExist(uint128 unexistentProfileId) public { + function testCannotInitialize_IfSourceProfileDoesNotExist(uint96 unexistentProfileId) public { vm.assume(!hub.exists(unexistentProfileId)); vm.expectRevert(Errors.TokenDoesNotExist.selector); @@ -142,7 +142,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: quotesRestricted, mirrorsRestricted: mirrorsRestricted, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -153,7 +153,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { assertEq(config.quotesRestricted, quotesRestricted); assertEq(config.mirrorsRestricted, mirrorsRestricted); assertEq(config.degreesOfSeparation, degrees); - assertEq(config.sourceProfile, uint128(originalPublisher.profileId)); + assertEq(config.sourceProfile, uint96(originalPublisher.profileId)); } function testCannotProcessComment_IfDegreesOfSeparationRestrictionIsNotMet_PathLength(uint8 degrees) public { @@ -171,7 +171,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: false, mirrorsRestricted: false, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -189,7 +189,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -226,7 +226,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: false, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -244,7 +244,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -281,7 +281,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: false, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -299,7 +299,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: false, mirrorsRestricted: false, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -338,7 +338,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -356,7 +356,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -395,7 +395,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -413,7 +413,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -452,7 +452,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -470,7 +470,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -509,7 +509,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -527,7 +527,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -566,7 +566,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -584,7 +584,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -623,7 +623,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -641,7 +641,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -677,7 +677,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { // quotesRestricted: true, // mirrorsRestricted: true, // degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - // sourceProfile: uint128(originalPublisher.profileId) + // sourceProfile: uint96(originalPublisher.profileId) // }) // ); @@ -700,7 +700,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { // quotesRestricted: true, // mirrorsRestricted: true, // degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - // sourceProfile: uint128(originalPublisher.profileId) + // sourceProfile: uint96(originalPublisher.profileId) // }) // ); @@ -736,7 +736,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { // quotesRestricted: true, // mirrorsRestricted: true, // degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - // sourceProfile: uint128(originalPublisher.profileId) + // sourceProfile: uint96(originalPublisher.profileId) // }) // ); @@ -759,7 +759,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { // quotesRestricted: true, // mirrorsRestricted: true, // degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - // sourceProfile: uint128(originalPublisher.profileId) + // sourceProfile: uint96(originalPublisher.profileId) // }) // ); @@ -795,7 +795,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { // quotesRestricted: true, // mirrorsRestricted: true, // degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - // sourceProfile: uint128(originalPublisher.profileId) + // sourceProfile: uint96(originalPublisher.profileId) // }) // ); @@ -818,7 +818,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { // quotesRestricted: true, // mirrorsRestricted: true, // degreesOfSeparation: MAX_DEGREES_OF_SEPARATION, - // sourceProfile: uint128(originalPublisher.profileId) + // sourceProfile: uint96(originalPublisher.profileId) // }) // ); @@ -854,7 +854,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -893,7 +893,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -910,7 +910,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -934,11 +934,11 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { function testCannotProcessComment_IfNotInheritingConfig_WrongSourceProfile( uint8 degrees, - uint128 wrongSourceProfile + uint96 wrongSourceProfile ) public { degrees = uint8(bound(degrees, 1, MAX_DEGREES_OF_SEPARATION)); vm.assume(hub.exists(wrongSourceProfile)); - vm.assume(wrongSourceProfile != uint128(originalPublisher.profileId)); + vm.assume(wrongSourceProfile != uint96(originalPublisher.profileId)); // Initializes module for (profile: originalPublisher.profileId, pubId: 1) vm.prank(hubAddress); @@ -951,7 +951,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1006,7 +1006,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1023,7 +1023,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: wrongDegrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1059,7 +1059,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1098,7 +1098,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1137,7 +1137,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1176,7 +1176,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: false, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1215,7 +1215,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: false, mirrorsRestricted: true, degreesOfSeparation: degrees, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1252,7 +1252,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1267,7 +1267,55 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) + }) + ); + + _mockLensHubPubCountResponse({account: originalPublisher, pubCount: 2}); + + vm.prank(hubAddress); + module.processComment( + Types.ProcessCommentParams({ + profileId: originalPublisher.profileId, + transactionExecutor: originalPublisher.owner, + pointedProfileId: originalPublisher.profileId, + pointedPubId: 1, + referrerProfileIds: _emptyUint256Array(), + referrerPubIds: _emptyUint256Array(), + referrerPubTypes: _emptyPubTypesArray(), + data: abi.encode(_emptyUint256Array()) + }) + ); + } + + function testProcessComment_WhenRestricted_ButCurrentPublisherIsSourceProfile() public { + // Initializes module for (profile: originalPublisher.profileId, pubId: 1) + vm.prank(hubAddress); + module.initializeReferenceModule( + originalPublisher.profileId, + 1, + originalPublisher.owner, + _getInitData({ + commentsRestricted: true, + quotesRestricted: true, + mirrorsRestricted: true, + degreesOfSeparation: 2, + sourceProfile: uint96(originalPublisher.profileId) + }) + ); + + // Initializes module for (profile: originalPublisher.profileId, pubId: 2) + vm.prank(hubAddress); + module.initializeReferenceModule( + originalPublisher.profileId, + 2, + originalPublisher.owner, + _getInitData({ + commentsRestricted: true, + quotesRestricted: true, + mirrorsRestricted: true, + degreesOfSeparation: 2, + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1300,7 +1348,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1315,7 +1363,55 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) + }) + ); + + _mockLensHubPubCountResponse({account: originalPublisher, pubCount: 2}); + + vm.prank(hubAddress); + module.processMirror( + Types.ProcessMirrorParams({ + profileId: originalPublisher.profileId, + transactionExecutor: originalPublisher.owner, + pointedProfileId: originalPublisher.profileId, + pointedPubId: 1, + referrerProfileIds: _emptyUint256Array(), + referrerPubIds: _emptyUint256Array(), + referrerPubTypes: _emptyPubTypesArray(), + data: abi.encode(_emptyUint256Array()) + }) + ); + } + + function testProcessMirror_WhenRestricted_ButCurrentPublisherIsSourceProfile() public { + // Initializes module for (profile: originalPublisher.profileId, pubId: 1) + vm.prank(hubAddress); + module.initializeReferenceModule( + originalPublisher.profileId, + 1, + originalPublisher.owner, + _getInitData({ + commentsRestricted: true, + quotesRestricted: true, + mirrorsRestricted: true, + degreesOfSeparation: 2, + sourceProfile: uint96(originalPublisher.profileId) + }) + ); + + // Initializes module for (profile: originalPublisher.profileId, pubId: 2) + vm.prank(hubAddress); + module.initializeReferenceModule( + originalPublisher.profileId, + 2, + originalPublisher.owner, + _getInitData({ + commentsRestricted: true, + quotesRestricted: true, + mirrorsRestricted: true, + degreesOfSeparation: 2, + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1348,7 +1444,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1363,7 +1459,55 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) + }) + ); + + _mockLensHubPubCountResponse({account: originalPublisher, pubCount: 2}); + + vm.prank(hubAddress); + module.processQuote( + Types.ProcessQuoteParams({ + profileId: originalPublisher.profileId, + transactionExecutor: originalPublisher.owner, + pointedProfileId: originalPublisher.profileId, + pointedPubId: 1, + referrerProfileIds: _emptyUint256Array(), + referrerPubIds: _emptyUint256Array(), + referrerPubTypes: _emptyPubTypesArray(), + data: abi.encode(_emptyUint256Array()) + }) + ); + } + + function testProcessQuote_WhenRestricted_ButCurrentPublisherIsSourceProfile() public { + // Initializes module for (profile: originalPublisher.profileId, pubId: 1) + vm.prank(hubAddress); + module.initializeReferenceModule( + originalPublisher.profileId, + 1, + originalPublisher.owner, + _getInitData({ + commentsRestricted: true, + quotesRestricted: true, + mirrorsRestricted: true, + degreesOfSeparation: 2, + sourceProfile: uint96(originalPublisher.profileId) + }) + ); + + // Initializes module for (profile: originalPublisher.profileId, pubId: 2) + vm.prank(hubAddress); + module.initializeReferenceModule( + originalPublisher.profileId, + 2, + originalPublisher.owner, + _getInitData({ + commentsRestricted: true, + quotesRestricted: true, + mirrorsRestricted: true, + degreesOfSeparation: 2, + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1396,7 +1540,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1414,7 +1558,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1448,7 +1592,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1466,7 +1610,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1500,7 +1644,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1518,7 +1662,7 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { quotesRestricted: true, mirrorsRestricted: true, degreesOfSeparation: 0, - sourceProfile: uint128(originalPublisher.profileId) + sourceProfile: uint96(originalPublisher.profileId) }) ); @@ -1540,6 +1684,11 @@ contract DegreesOfSeparationReferenceModuleTest is BaseTest { ); } + // TODO - test the new logic: + // - if the current publisher is the originalAuthor or source profile, then it can reply without restrictions + // - you cannot init degrees on a comment, only on post and quote + // etc + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function _mockLensHubPubCountResponse(TestAccount memory account, uint256 pubCount) internal {