diff --git a/README.md b/README.md index e392059..a990809 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# Smart Housing \ No newline at end of file +# Smart Housing + diff --git a/packages/backend/contracts/housing-project/HousingSFT.sol b/packages/backend/contracts/housing-project/HousingSFT.sol index c45b7f3..005e730 100644 --- a/packages/backend/contracts/housing-project/HousingSFT.sol +++ b/packages/backend/contracts/housing-project/HousingSFT.sol @@ -85,7 +85,7 @@ contract HousingSFT is SFT { }) ); - return _mint(depositor, mintShare, attributes, ""); + return _mint(depositor, mintShare, attributes); } /// @notice Retrieves the SFT attributes for a given owner and nonce. @@ -101,7 +101,7 @@ contract HousingSFT is SFT { "HousingSFT: No tokens found for user at nonce" ); - return abi.decode(getRawTokenAttributes(nonce), (HousingAttributes)); + return abi.decode(_getRawTokenAttributes(nonce), (HousingAttributes)); } /// @notice Returns the maximum supply of the HousingSFT tokens. diff --git a/packages/backend/contracts/main/HST.sol b/packages/backend/contracts/main/HST.sol index 1d80cb7..af539fb 100644 --- a/packages/backend/contracts/main/HST.sol +++ b/packages/backend/contracts/main/HST.sol @@ -89,11 +89,18 @@ contract HousingStakingToken is SFT { }); // Mint the HST token - uint256 nonce = _mint(caller, 1, abi.encode(attr), ""); + uint256 nonce = _mint(caller, 1, abi.encode(attr)); emit MintHstToken(caller, nonce, attr); } + function getAttribute(uint256 nonce) external view returns (HstAttributes memory) { + return abi.decode( + _getRawTokenAttributes(nonce), + (HstAttributes) + ); + } + /// @notice Retrieves the balance of HST tokens for a specified user. /// @param user Address of the user whose balance is to be retrieved. /// @return balance Array of HSTBalance representing the user's HST holdings. diff --git a/packages/backend/contracts/main/SmartHousing.sol b/packages/backend/contracts/main/SmartHousing.sol index 8e5fffd..6f410b6 100644 --- a/packages/backend/contracts/main/SmartHousing.sol +++ b/packages/backend/contracts/main/SmartHousing.sol @@ -162,10 +162,7 @@ contract SmartHousing is ISmartHousing, Ownable, UserModule, ERC1155Holder { .lastFundsDispatchEpoch < currentEpoch(); if (rewardsCanBeGenerated) return true; - HstAttributes memory hstAttr = abi.decode( - hst.getRawTokenAttributes(tokenNonce), - (HstAttributes) - ); + HstAttributes memory hstAttr = hst.getAttribute(tokenNonce); return hstAttr.shtRewardPerShare < distributionStorage.shtRewardPerShare; } @@ -186,9 +183,7 @@ contract SmartHousing is ISmartHousing, Ownable, UserModule, ERC1155Holder { distributionStorage.generateRewards(epochsAndPeriodsStorage); (uint256 claimedSHT, HstAttributes memory hstAttr) = distributionStorage - .claimRewards( - abi.decode(hst.getRawTokenAttributes(hstNonce), (HstAttributes)) - ); + .claimRewards(hst.getAttribute(hstNonce)); uint256 rentRewards = 0; // Claim rent rewards from HousingProjects diff --git a/packages/backend/contracts/modules/LockedSmartHousingToken.sol b/packages/backend/contracts/modules/LockedSmartHousingToken.sol index 185a593..307f523 100644 --- a/packages/backend/contracts/modules/LockedSmartHousingToken.sol +++ b/packages/backend/contracts/modules/LockedSmartHousingToken.sol @@ -75,8 +75,18 @@ contract LkSHT is SFT { LkSHTAttributes.newAttributes(startTimestamp, amount) ); - super._mint(to, amount, attributes, "LockedSmartHousingToken"); + super._mint(to, amount, attributes); emit TokensMinted(to, amount); } + + function getAttribute( + uint256 nonce + ) external view returns (LkSHTAttributes.Attributes memory) { + return + abi.decode( + _getRawTokenAttributes(nonce), + (LkSHTAttributes.Attributes) + ); + } } diff --git a/packages/backend/contracts/modules/SFT.sol b/packages/backend/contracts/modules/SFT.sol index 4b16a10..a22230c 100644 --- a/packages/backend/contracts/modules/SFT.sol +++ b/packages/backend/contracts/modules/SFT.sol @@ -36,22 +36,19 @@ contract SFT is ERC1155, Ownable { function _mint( address to, uint256 amount, - bytes memory attributes, - bytes memory data - ) internal returns (uint256) { + bytes memory attributes + ) internal returns (uint256 nonce) { _nonceCounter.increment(); - uint256 nonce = _nonceCounter.current(); + nonce = _nonceCounter.current(); // Store the attributes _tokenAttributes[nonce] = attributes; // Mint the token with the nonce as its ID - super._mint(to, nonce, amount, data); + super._mint(to, nonce, amount, ""); // Track the nonce for the address _addressToNonces[to].add(nonce); - - return nonce; } /// @dev Returns the name of the token. @@ -72,9 +69,9 @@ contract SFT is ERC1155, Ownable { /// @dev Returns raw token attributes by nonce. /// @param nonce The nonce of the token. /// @return Attributes in bytes. - function getRawTokenAttributes( + function _getRawTokenAttributes( uint256 nonce - ) public view returns (bytes memory) { + ) internal view returns (bytes memory) { return _tokenAttributes[nonce]; } @@ -106,7 +103,7 @@ contract SFT is ERC1155, Ownable { bytes memory attr ) external onlyOwner returns (uint256) { _burn(user, nonce, amount); - return _mint(user, amount, attr, ""); + return amount > 0 ? _mint(user, amount, attr) : 0; } /// @dev Returns the balance of the user with their token attributes. @@ -151,11 +148,10 @@ contract SFT is ERC1155, Ownable { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { - _addressToNonces[from].remove(ids[i]); - } + uint256 id = ids[i]; - for (uint256 i = 0; i < ids.length; i++) { - _addressToNonces[to].add(ids[i]); + _addressToNonces[from].remove(id); + _addressToNonces[to].add(id); } } } diff --git a/packages/backend/contracts/project-funding/ProjectFunding.sol b/packages/backend/contracts/project-funding/ProjectFunding.sol index cc352fe..578cef9 100644 --- a/packages/backend/contracts/project-funding/ProjectFunding.sol +++ b/packages/backend/contracts/project-funding/ProjectFunding.sol @@ -229,10 +229,7 @@ contract ProjectFunding is Ownable { uint256 lkShtBal = lkSht.balanceOf(caller, nonce); require(lkShtBal > 0, "ProjectFunding: Nothing to unlock"); - LkSHTAttributes.Attributes memory attr = abi.decode( - lkSht.getRawTokenAttributes(nonce), - (LkSHTAttributes.Attributes) - ); + LkSHTAttributes.Attributes memory attr = lkSht.getAttribute(nonce); ( uint256 totalUnlockedAmount, LkSHTAttributes.Attributes memory newAttr diff --git a/packages/ui/app/properties/BuyPropertyModal.tsx b/packages/ui/app/properties/BuyPropertyModal.tsx index f9d97b8..4b72f11 100644 --- a/packages/ui/app/properties/BuyPropertyModal.tsx +++ b/packages/ui/app/properties/BuyPropertyModal.tsx @@ -13,8 +13,8 @@ import useRawCallsInfo from "~~/hooks/useRawCallsInfo"; import { useSpendERC20 } from "~~/hooks/useSpendERC20"; import { RefIdData } from "~~/utils"; -type Props = ProjectsValue["projectData"] & { purchased?: bigint; unitPrice: bigint }; -export default function BuyPropertyModal({ unitPrice, data, fundingToken, sftDetails, purchased }: Props) { +type Props = ProjectsValue["projectData"] & { purchased?: bigint; unitPrice: bigint; imgSrc: string }; +export default function BuyPropertyModal({ imgSrc, unitPrice, data, fundingToken, sftDetails, purchased }: Props) { const unitsLeft = +BigNumber(sftDetails.maxSupply.toString()) .multipliedBy((data.fundingGoal - data.collectedFunds).toString()) .dividedBy(data.fundingGoal.toString()) @@ -88,7 +88,7 @@ export default function BuyPropertyModal({ unitPrice, data, fundingToken, sftDet