Files
core/contracts/libraries/ActionLib.sol
donosonaumczuk 03e5d9c31a feat: Permissionless modules - Impl in progress
Co-authored-by: Victor Naumik <vicnaum@gmail.com>
2023-09-08 18:59:00 +01:00

70 lines
3.1 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import {Types} from 'contracts/libraries/constants/Types.sol';
import {StorageLib} from 'contracts/libraries/StorageLib.sol';
import {ValidationLib} from 'contracts/libraries/ValidationLib.sol';
import {IPublicationActionModule} from 'contracts/interfaces/IPublicationActionModule.sol';
import {Errors} from 'contracts/libraries/constants/Errors.sol';
import {Events} from 'contracts/libraries/constants/Events.sol';
library ActionLib {
function act(
Types.PublicationActionParams calldata publicationActionParams,
address transactionExecutor,
address actorProfileOwner
) external returns (bytes memory) {
ValidationLib.validateNotBlocked({
profile: publicationActionParams.actorProfileId,
byProfile: publicationActionParams.publicationActedProfileId
});
Types.Publication storage _actedOnPublication = StorageLib.getPublication(
publicationActionParams.publicationActedProfileId,
publicationActionParams.publicationActedId
);
if (!_isActionEnabled(_actedOnPublication, publicationActionParams.actionModuleAddress)) {
// This will also revert for:
// - Non-existent action modules
// - Non-existent publications
// - Legacy V1 publications
// Because the storage will be empty.
revert Errors.ActionNotAllowed();
}
Types.PublicationType[] memory referrerPubTypes = ValidationLib.validateReferrersAndGetReferrersPubTypes(
publicationActionParams.referrerProfileIds,
publicationActionParams.referrerPubIds,
publicationActionParams.publicationActedProfileId,
publicationActionParams.publicationActedId
);
bytes memory actionModuleReturnData = IPublicationActionModule(publicationActionParams.actionModuleAddress)
.processPublicationAction(
Types.ProcessActionParams({
publicationActedProfileId: publicationActionParams.publicationActedProfileId,
publicationActedId: publicationActionParams.publicationActedId,
actorProfileId: publicationActionParams.actorProfileId,
actorProfileOwner: actorProfileOwner,
transactionExecutor: transactionExecutor,
referrerProfileIds: publicationActionParams.referrerProfileIds,
referrerPubIds: publicationActionParams.referrerPubIds,
referrerPubTypes: referrerPubTypes,
actionModuleData: publicationActionParams.actionModuleData
})
);
emit Events.Acted(publicationActionParams, actionModuleReturnData, transactionExecutor, block.timestamp);
return actionModuleReturnData;
}
function _isActionEnabled(
Types.Publication storage _publication,
address actionModuleAddress
) private view returns (bool) {
return _publication.actionModuleEnabled[actionModuleAddress];
}
}