mirror of
https://github.com/lens-protocol/core.git
synced 2026-01-10 14:48:15 -05:00
74 lines
2.9 KiB
Solidity
74 lines
2.9 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.8.15;
|
|
|
|
import {ILensHub} from 'contracts/interfaces/ILensHub.sol';
|
|
import {LensV2Migration} from 'contracts/misc/LensV2Migration.sol';
|
|
import {Types} from 'contracts/libraries/constants/Types.sol';
|
|
import {ImmutableOwnable} from 'contracts/misc/ImmutableOwnable.sol';
|
|
|
|
import {ILensHandles} from 'contracts/interfaces/ILensHandles.sol';
|
|
import {ITokenHandleRegistry} from 'contracts/interfaces/ITokenHandleRegistry.sol';
|
|
|
|
/**
|
|
* @title ProfileCreationProxy
|
|
* @author Lens Protocol
|
|
*
|
|
* @notice This is an ownable proxy contract that enforces ".lens" handle suffixes at profile creation.
|
|
* Only the owner can create profiles.
|
|
*/
|
|
contract ProfileCreationProxy is ImmutableOwnable {
|
|
ILensHandles immutable LENS_HANDLES;
|
|
ITokenHandleRegistry immutable TOKEN_HANDLE_REGISTRY;
|
|
|
|
error ProfileAlreadyExists();
|
|
|
|
constructor(
|
|
address owner,
|
|
address hub,
|
|
address lensHandles,
|
|
address tokenHandleRegistry
|
|
) ImmutableOwnable(owner, hub) {
|
|
LENS_HANDLES = ILensHandles(lensHandles);
|
|
TOKEN_HANDLE_REGISTRY = ITokenHandleRegistry(tokenHandleRegistry);
|
|
}
|
|
|
|
function proxyCreateProfile(
|
|
Types.CreateProfileParams calldata createProfileParams
|
|
) external onlyOwner returns (uint256) {
|
|
return ILensHub(LENS_HUB).createProfile(createProfileParams);
|
|
}
|
|
|
|
function proxyCreateProfileWithHandle(
|
|
Types.CreateProfileParams memory createProfileParams,
|
|
string calldata handle
|
|
) external onlyOwner returns (uint256, uint256) {
|
|
// Check if LensHubV1 already has a profile with this handle that was not migrated yet:
|
|
bytes32 handleHash = keccak256(bytes(string.concat(handle, '.lens')));
|
|
if (LensV2Migration(LENS_HUB).getProfileIdByHandleHash(handleHash) != 0) {
|
|
revert ProfileAlreadyExists();
|
|
}
|
|
|
|
// We mint the handle & profile to this contract first, then link it to the profile
|
|
// This will not allow to initialize follow modules that require funds from the msg.sender,
|
|
// but we assume only simple follow modules should be set during profile creation.
|
|
// Complex ones can be set after the profile is created.
|
|
address destination = createProfileParams.to;
|
|
createProfileParams.to = address(this);
|
|
uint256 profileId = ILensHub(LENS_HUB).createProfile(createProfileParams);
|
|
uint256 handleId = LENS_HANDLES.mintHandle(address(this), handle);
|
|
|
|
TOKEN_HANDLE_REGISTRY.link({handleId: handleId, profileId: profileId});
|
|
|
|
// Transfer the handle & profile to the destination
|
|
LENS_HANDLES.transferFrom(address(this), destination, handleId);
|
|
ILensHub(LENS_HUB).transferFrom(address(this), destination, profileId);
|
|
|
|
return (profileId, handleId);
|
|
}
|
|
|
|
function proxyCreateHandle(address to, string calldata handle) external onlyOwner returns (uint256) {
|
|
return LENS_HANDLES.mintHandle(to, handle);
|
|
}
|
|
}
|