Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion contracts/src/protocol-hook-pkg/ProtocolHookMediator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {IProtocolAdminPanel} from "@hook-bazaar/protocol-pkg/src/ProtocolAdminPa
import {IProtocolAdminClient} from "@hook-bazaar/protocol-pkg/src/ProtocolAdminClient.sol";
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
import {InitializableBase} from "compose-extensions/LibInitializable.sol";
import {PoolId, PoolIdLibrary} from "@uniswap/v4-core/src/types/PoolId.sol";

interface IProtocolHookMediator{
function initialize(IMasterHook _masterHook,IProtocolAdminClient protocolAdminClient,IPositionManager positionManager) external;
Expand Down Expand Up @@ -68,8 +69,9 @@ contract ProtocolHookMediator is IProtocolHookMediator, Context, InitializableBa
poolKey,
_initialSqrtPrice
);


return abi.encode(tick);
return abi.encode(tick, PoolIdLibrary.toId(poolKey));
}
}
}
100 changes: 80 additions & 20 deletions contracts/src/protocol-pkg/ProtocolAdminClient.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import {InitializableBase} from "compose-extensions/LibInitializable.sol";
import "Compose/access/Owner/OwnerMod.sol" as OwnerMod;
import {ProtocolAdminPanel, IProtocolAdminPanel} from "./ProtocolAdminPanel.sol";
import {IProtocolAdminRegistry} from "./ProtocolAdminRegistry.sol";
import {IProtocolFactory} from "./ProtocolFactoryFacet.sol";
import {IProtocolFactory, IProtocolAdminPanelConsumer} from "./ProtocolFactoryFacet.sol";
import {IProtocolAdminManager, Authority} from "@hook-bazaar/protocol-pkg/src/ProtocolAdminManager.sol";
import {IProtocolHookMediator} from "@hook-bazaar/protocol-hook-pkg/src/ProtocolHookMediator.sol";
import {PoolKey} from "@uniswap/v4-core/src/types/PoolKey.sol";

import {PoolId, PoolKey, PoolIdLibrary} from "@uniswap/v4-core/src/types/PoolId.sol";


interface IProtocolAdminClient{
Expand All @@ -27,14 +27,24 @@ interface IProtocolAdminClient{

//==================================================================================================================

function adminPanel() external view returns(address);
function nextTokenId() external view returns(uint256);

//====================================PROTOCOL-CREATOR===============================================================
function create_protocol(string calldata _name) external returns(uint256);
function create_protocol(string calldata _name) external returns(uint256, address _adminManager);
event ProtocolCreated(address indexed protocolCaller, uint256 indexed tokenId, address indexed __adminManager);

function create_pool(uint256 protocolId, bytes calldata _encoded_pool_key, uint160 initialSqrtPrice) external returns(bytes32);

function getProtocols() external returns(uint256[] memory);
function getProtocolRevenue(uint256 protocolId) external returns(uint256);
function getPoolRevenue(uint256 protocolId, PoolId poolId) external returns(uint256);



//======================================POOL-CREATOR=======================================================================
function create_pool(uint256 protocolId, bytes calldata _encoded_pool_key, uint160 initialSqrtPrice) external returns(PoolId, int24);
function getProtocolActivePools(uint256 protocolId) external returns(PoolId[] memory);
function getNumberOfActivePools(uint256 protocolId) external returns(uint256);



function setProtocolHookMediator(IProtocolHookMediator _hookMediator) external;
Expand All @@ -45,8 +55,13 @@ interface IProtocolAdminClient{

}

interface IOwnable{
function owner() external view returns(address);
}


contract ProtocolAdminClient is IProtocolAdminClient, InitializableBase{

contract ProtocolAdminClient is IProtocolAdminClient, IProtocolAdminPanelConsumer ,InitializableBase, IOwnable{

bytes32 constant PROTOCOL_ADMIN_CLIENT_POSITION = keccak256("hook-bazaar.protocol.admin-client");

Expand Down Expand Up @@ -98,53 +113,98 @@ contract ProtocolAdminClient is IProtocolAdminClient, InitializableBase{
IProtocolAdminRegistry($.admin_panel)._initialize();
}




function owner() public view returns(address){
OwnerMod.OwnerStorage storage o$ = OwnerMod.getStorage();
return o$.owner;
}


// NOTE: The caller can delegate ownership of the protocol to an __auth address, defaults to msg.sender

// if __auth is 0, the name is only for visibilty
function create_protocol(string calldata _name) external onlyInitialized returns(uint256){


function create_protocol(string calldata _name) external onlyInitialized returns(uint256, address){

ProtocolAdminClientStorage storage $ = getStorage();

uint256 _token_id = $.nextTokenId;
address _protocol_admin_manager = IProtocolAdminRegistry($.admin_panel).protocol_manager(_token_id);
address _protocol_admin_manager = IProtocolAdminRegistry($.admin_panel).setProtocolManager(_token_id, msg.sender);
IProtocolFactory($.admin_panel).create_protocol(_name, _protocol_admin_manager, _token_id);
IProtocolAdminPanel($.admin_panel).unlockAdminManager(IProtocolAdminManager(_protocol_admin_manager));

emit ProtocolCreated(msg.sender, _token_id,_protocol_admin_manager);
$.nextTokenId++;
return _token_id;

return (_token_id, _protocol_admin_manager);
}

function getProtocols() external returns(uint256[] memory){
ProtocolAdminClientStorage storage $ = getStorage();
return IProtocolFactory($.admin_panel).getProtocols(msg.sender);
}

function getProtocolRevenue(uint256 protocolId) external returns(uint256){}
function getPoolRevenue(uint256 protocolId, PoolId poolId) external returns(uint256){}

function create_pool(uint256 protocolId, bytes calldata _encoded_pool_key, uint160 initialSqrtPrice) external onlyInitialized returns(bytes32){

function create_pool(uint256 protocolId, bytes calldata _encoded_pool_key, uint160 initialSqrtPrice) external onlyInitialized returns(PoolId, int24){

ProtocolAdminClientStorage storage $ = getStorage();
console2.log("Protocol Creator:", msg.sender);
bytes4 createPoolSig = msg.sig;
console2.logBytes4(createPoolSig);
// NOTE: With protocolId one can fetch the associated adminManager
address adminManager = IProtocolAdminRegistry($.admin_panel).protocol_manager(protocolId);
// if (!Authority($.admin_panel).canCall(msg.sender, adminManager, createPoolSig)) revert ProtocolAdminClientUnauthorizedCaller();
address adminManager = IProtocolAdminRegistry($.admin_panel).getProtocolManager(protocolId);
bool _isPoolCreator = IProtocolAdminRegistry($.admin_panel).isPoolCreator(adminManager, msg.sender);

if (!_isPoolCreator) revert ProtocolAdminClientUnauthorizedCaller();

PoolKey memory poolKey = abi.decode(_encoded_pool_key, (PoolKey));
int24 _initialTick = abi.decode(

(int24 _initialTick, PoolId poolId) = abi.decode(
IProtocolHookMediator($.protocolHookMediator).notify(
address(this) ,
createPoolSig,
abi.encode(protocolId, poolKey, initialSqrtPrice)),
(int24)
(int24, PoolId)
);
IProtocolAdminRegistry($.admin_panel).addPool(adminManager, poolId);
return (poolId,_initialTick);
}

function getProtocolActivePools(uint256 protocolId) public returns(PoolId[] memory){
ProtocolAdminClientStorage storage $ = getStorage();
address protocolManager = IProtocolAdminRegistry($.admin_panel).getProtocolManager(protocolId);
PoolId[] memory protocolPools = IProtocolAdminRegistry($.admin_panel).getProtocolPools(protocolManager);
return protocolPools;

// protocols per accout are stored on protocolFactory
// pools per protocol are created on protocolHookMediator
// pools per protocol MUST be each stored on ProtocolAdminManager
// one protocol can have many pools
// one pool can be attached to many protocols (this is more complex)
}

function getNumberOfActivePools(uint256 protocolId) external returns(uint256){
return getProtocolActivePools(protocolId).length;
}



// - getProtocols() --> uint256[] protocols
// - for protocol in protocols:
// - getPools(protocol)
// - getTotalRevenue(protocol)
// - getProtocolMetadata(protocol)





function supportsInterface(bytes4 interfaceID) external view returns (bool){
return interfaceID == type(IProtocolAdminClient).interfaceId;
}

function setProtocolHookMediator(IProtocolHookMediator _hookMediator) external{
function setProtocolHookMediator(IProtocolHookMediator _hookMediator) external onlyInitialized{
OwnerMod.requireOwner();
ProtocolAdminClientStorage storage $ = getStorage();
$.protocolHookMediator = address(_hookMediator);
Expand Down
Loading
Loading