Untitled

 avatar
unknown
plain_text
a year ago
3.4 kB
5
Indexable
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract PropertyListing is ERC1155, Ownable {

    struct Fraction {
        uint256 fractionId;
        address receiver;
        uint256 amount;
    }

    struct Property {
       uint256 tokenId;
       uint256 metadataURL; 
    }

    mapping(uint256 => Fraction[]) fractions;
    mapping(uint256 => Property) public properties;

    constructor(address initialOwner, string memory uri)
        Ownable(initialOwner)
        ERC1155(uri) {
    }

    event PropertyListed(uint256 id);

    function createProperty(
        uint256 tokenId,
        Property calldata params
    ) external onlyOwner returns (uint256) {
        properties[tokenId] = params;
        emit PropertyListed(tokenId);
        return tokenId;
    }

    function getProperty(uint256 tokenId)
        public 
        view 
        returns (
            Property memory
        ) {
        return properties[tokenId];
    }

    function createFraction(
        uint256 tokenId, Fraction calldata fraction
    ) external onlyOwner returns (uint256) {

        Fraction[] memory fractionList = fractions[tokenId];
        for (uint256 i = 0; i < fractionList.length; i++) {
            if (fractionList[i].fractionId == fraction.fractionId) {
                fractions[tokenId][i] = fraction;
                return tokenId;
            }
        }
        revert("tokenId not found");

    }

    function getFraction(uint256 tokenId, Fraction calldata fraction)
        public
        view
        returns (
            Fraction memory
        ) {

        Fraction[] memory fractionList = fractions[tokenId];
        for (uint256 i = 0; i < fractionList.length; i++) {
            if (fractionList[i].fractionId == fraction.fractionId) {
                return fractions[tokenId][i];
            }
        }
        revert("tokenId not found");

    }

    function mintProperty(uint256 tokenId) public {

        Fraction[] memory frac = fractions[tokenId];
        for (uint256 idx = 0; idx < frac.length; idx++) {
            uint256 count = 0;
            uint256[] memory amounts;
            uint256[] memory tokenList;

            for (uint256 i = 0; i < frac.length; i++) {
                if (frac[i].receiver == frac[0].receiver) {
                    tokenList[count] = tokenId;
                    amounts[count] = frac[i].amount;
                    count++;
                } 
            }
            _mintBatch(frac[idx].receiver, tokenList, amounts, "");
            count = 0;
        }

    }

    function burnProperty(uint256 tokenId) public onlyOwner {
        Fraction[] memory frac = fractions[tokenId];

        for (uint256 idx = 0; idx < frac.length; idx++) {
                uint256 count = 0;
                uint256[] memory amounts;
                uint256[] memory tokenList;
                for (uint256 i = 0; i < frac.length; i++) {
                    if (frac[i].receiver == frac[0].receiver) {
                        tokenList[count] = tokenId;
                        amounts[count] = frac[i].amount;
                        count++;
                    } 
                }
                _burnBatch(frac[idx].receiver, tokenList, amounts);
                count = 0;
            }
        }

}
Editor is loading...
Leave a Comment