From b0ffd33199d2795f4a719e4bbb3e2ec8db426322 Mon Sep 17 00:00:00 2001 From: AkankshaAttavr Date: Thu, 30 May 2024 15:51:06 +0530 Subject: [PATCH 1/2] added checkOnlyProfileOwner function --- src/core/registry.cairo | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/core/registry.cairo b/src/core/registry.cairo index 5d7c7cd..99a8066 100644 --- a/src/core/registry.cairo +++ b/src/core/registry.cairo @@ -119,21 +119,24 @@ pub mod Registry { /// ==================================== #[generate_trait] impl RegistryInternalImpl of RegistryInternalTrait { // Issue no. #19 Implement the functionality of _generateProfileId - // Internal function to create a profile - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L366 - // Reference on how to implement keccak256(abi.encodePacked) - // Solidity - https://github.com/celestiaorg/blobstream-contracts/blob/0b4bcf69d1ce96df000da7f95fba8c03aa15a45e/src/lib/tree/namespace/TreeHasher.sol#L33 - // Cairo - https://github.com/keep-starknet-strange/blobstream-starknet/blob/b74777e5fb479e5b4aa5a1419135e0826343fc37/src/tree/namespace/hasher.cairo#L10 - // More about it - https://github.com/keep-starknet-strange/alexandria/tree/main/src/encoding - - // Issue no. #18 Implement the functionality of _generateAnchor - // Internal function to create a _generateAnchor - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L340 - - // Issue no. #17 Implement the functionality of _checkOnlyProfileOwner - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L331 - + // Internal function to create a profile + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L366 + // Reference on how to implement keccak256(abi.encodePacked) + // Solidity - https://github.com/celestiaorg/blobstream-contracts/blob/0b4bcf69d1ce96df000da7f95fba8c03aa15a45e/src/lib/tree/namespace/TreeHasher.sol#L33 + // Cairo - https://github.com/keep-starknet-strange/blobstream-starknet/blob/b74777e5fb479e5b4aa5a1419135e0826343fc37/src/tree/namespace/hasher.cairo#L10 + // More about it - https://github.com/keep-starknet-strange/alexandria/tree/main/src/encoding + + // Issue no. #18 Implement the functionality of _generateAnchor + // Internal function to create a _generateAnchor + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L340 + + // Issue no. #17 Implement the functionality of _checkOnlyProfileOwner + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L331 + + fn _checkOnlyProfileOwner(_profileId: u256) { + assert(_isOwnerOfProfile(_profileId, get_caller_address()), Errors::UNAUTHORIZED); + } // Issue no. #4 Implement the functionality of _generateProfileId // Down below is the function that is to be implemented in the contract but in cairo. // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L375C14-L375C31 From 7d8165ca073afd0bd886c118da0cc3efe135daca Mon Sep 17 00:00:00 2001 From: AkankshaAttavr Date: Sat, 1 Jun 2024 04:05:30 +0530 Subject: [PATCH 2/2] feat : implemented is_owner_of_profile function --- src/core/libraries.cairo | 2 +- src/core/libraries/errors.cairo | 4 +- src/core/registry.cairo | 96 +++++++++++++++++++++------------ 3 files changed, 65 insertions(+), 37 deletions(-) diff --git a/src/core/libraries.cairo b/src/core/libraries.cairo index 47a2261..f77b474 100644 --- a/src/core/libraries.cairo +++ b/src/core/libraries.cairo @@ -1,2 +1,2 @@ mod clone; -mod errors; +pub mod errors; diff --git a/src/core/libraries/errors.cairo b/src/core/libraries/errors.cairo index d238fdf..08afed3 100644 --- a/src/core/libraries/errors.cairo +++ b/src/core/libraries/errors.cairo @@ -1,6 +1,6 @@ use starknet::{ContractAddress, contract_address_const}; -mod Errors { +pub mod Errors { /// Throws as an general error when input / data is invalid. const INVALID: felt252 = 'Data is invalid'; /// Thrown when mismatch in decoding data. @@ -8,7 +8,7 @@ mod Errors { /// Thrown when not enough funds are available const NOT_ENOUGH_FUNDS: felt252 = 'Not enough funds available'; /// Thrown when user is not authorized - const UNAUTHORIZED: felt252 = 'Not authorized'; + pub const UNAUTHORIZED: felt252 = 'Not authorized'; // // /// Thrown when address is the zero address // const ZERO_ADDRESS : ContractAddress = contract_address_const::<'0'>(); /// Thrown when the function is not implemented diff --git a/src/core/registry.cairo b/src/core/registry.cairo index 99a8066..3fdd758 100644 --- a/src/core/registry.cairo +++ b/src/core/registry.cairo @@ -21,17 +21,38 @@ use starknet::{ContractAddress, get_caller_address, get_contract_address, contra /// Registry contract interface /// Interface for the Registry contract. #[starknet::interface] -pub trait IRegistry {} - +pub trait IRegistry { + fn is_owner_of_profile(self: @TContractState, profile_id: u256, owner: ContractAddress) -> bool; +} #[starknet::contract] pub mod Registry { use starknet::ContractAddress; + // ========================== + // === Structs ============== + // ========================== + #[derive(Drop, Serde, starknet::Store)] + struct Metadata { + protocol: u256, + pointer: ByteArray, + } + + #[derive(Drop, Serde, starknet::Store)] + struct Profile { + id: u256, + nonce: u256, + name: ByteArray, + metadata: Metadata, + owner: ContractAddress, + anchor: ContractAddress, + } // ========================== // === Storage Variables ==== // ========================== #[storage] - struct Storage {} + struct Storage { + profiles_by_id: LegacyMap, + } /// ====================== /// ======= Events ======= @@ -57,35 +78,40 @@ pub mod Registry { impl Registry of super::IRegistry< ContractState > { // Issue no. #15 Implement the functionality to retrieve profile by profileId - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L94 - // Use _profileID as u256 + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L94 + // Use _profileID as u256 - // Issue no. #14 Implement the functionality to retrieve profile by anchor - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L102 + // Issue no. #14 Implement the functionality to retrieve profile by anchor + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L102 - // Issue no. #13 Implement the functionality of createProfile - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L118C5-L125C18 + // Issue no. #13 Implement the functionality of createProfile + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L118C5-L125C18 - // Issue no. #12 Implement the functionality of updateProfileName - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L182C14-L182C31 + // Issue no. #12 Implement the functionality of updateProfileName + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L182C14-L182C31 - // Issue no. #11 Implement the functionality of updateProfileMetadata - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L214C14-L214C35 + // Issue no. #11 Implement the functionality of updateProfileMetadata + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L214C14-L214C35 - // Issue no. #10 Implement the functionality of isOwnerOrMemberOfProfile - // Use u256 instead of bytes32 - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L229 + // Issue no. #10 Implement the functionality of isOwnerOrMemberOfProfile + // Use u256 instead of bytes32 + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L229 - // Issue no. #3 Implement the functionality of isOwnerOfProfile - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L245 + // Issue no. #3 Implement the functionality of isOwnerOfProfile + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L245 + fn is_owner_of_profile( + self: @ContractState, profile_id: u256, owner: ContractAddress + ) -> bool { + return self._is_owner_of_profile(profile_id, owner); + } // Issue no. #5 Implement the functionality of isMemberOfProfile // Down below is the function that is to be implemented in the contract but in cairo. // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L245 @@ -134,17 +160,19 @@ pub mod Registry { // Down below is the function that is to be implemented in the contract but in cairo. // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L331 - fn _checkOnlyProfileOwner(_profileId: u256) { - assert(_isOwnerOfProfile(_profileId, get_caller_address()), Errors::UNAUTHORIZED); - } - // Issue no. #4 Implement the functionality of _generateProfileId - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L375C14-L375C31 + // Issue no. #4 Implement the functionality of _generateProfileId + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L375C14-L375C31 - // Issue no. #3 Implement the functionality of _isOwnerOfProfile - // Down below is the function that is to be implemented in the contract but in cairo. - // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L375C14-L375C31 + // Issue no. #3 Implement the functionality of _isOwnerOfProfile + // Down below is the function that is to be implemented in the contract but in cairo. + // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L375C14-L375C31 + fn _is_owner_of_profile( + self: @ContractState, _profile_id: u256, _owner: ContractAddress + ) -> bool { + return self.profiles_by_id.read(_profile_id).owner == _owner; + } // Issue n. #5 Implement the functionality of _isMemberOfProfile // Down below is the function that is to be implemented in the contract but in cairo. // https://github.com/allo-protocol/allo-v2/blob/4dd0ea34a504a16ac90e80f49a5570b8be9b30e9/contracts/core/Registry.sol#L384C14-L384C32