git.delta.rocks / unique-network / refs/commits / 9753f46f665c

difftreelog

source

tests/src/eth/marketplace/MarketPlace.sol11.2 KiBsourcehistory
1// SPDX-License-Identifier:  Apache License2pragma solidity >=0.8.0;3import "../api/UniqueNFT.sol";45// Inline6interface ERC20Events {7    event Transfer(address indexed from, address indexed to, uint256 value);8    event Approval(9        address indexed owner,10        address indexed spender,11        uint256 value12    );13}1415interface ERC20 is Dummy, ERC165, ERC20Events {16    // Selector: name() 06fdde0317    function name() external view returns (string memory);1819    // Selector: symbol() 95d89b4120    function symbol() external view returns (string memory);2122    // Selector: totalSupply() 18160ddd23    function totalSupply() external view returns (uint256);2425    // Selector: decimals() 313ce56726    function decimals() external view returns (uint8);2728    // Selector: balanceOf(address) 70a0823129    function balanceOf(address owner) external view returns (uint256);3031    // Selector: transfer(address,uint256) a9059cbb32    function transfer(address to, uint256 amount) external returns (bool);3334    // Selector: transferFrom(address,address,uint256) 23b872dd35    function transferFrom(36        address from,37        address to,38        uint256 amount39    ) external returns (bool);4041    // Selector: approve(address,uint256) 095ea7b342    function approve(address spender, uint256 amount) external returns (bool);4344    // Selector: allowance(address,address) dd62ed3e45    function allowance(address owner, address spender)46        external47        view48        returns (uint256);49}5051interface UniqueFungible is Dummy, ERC165, ERC20 {}5253contract MarketPlace {54    struct Order {55        uint256 idNFT;56        address currencyCode; // UNIQ tokens as address address (1); wKSM57        uint256 price;58        uint256 time;59        address idCollection;60        address ownerAddr;61        uint8 flagActive;62        string name;63        string symbol;64        string tokenURI;65    }66    Order[] public orders;67    uint256 test;68    mapping(address => uint256) public balanceKSM; //  [ownerAddr][currency] => [KSMs]69    mapping(address => mapping(uint256 => uint256)) public asks; // [buyer][idCollection][idNFT] => idorder7071    mapping(address => uint256[]) public asksbySeller; // [addressSeller] =>idorder7273    address escrow;74    address owner;75    address nativecoin;7677    constructor(address _escrow) {78        escrow = _escrow;79        owner = msg.sender;8081        orders.push(82            Order(0, address(0), 0, 0, address(0), address(0), 0, "", "", "")83        );84    }8586    function setowner(address _newEscrow) public onlyOwner {87        escrow = _newEscrow;88    }8990    function setEscrow(address _newEscrow) public onlyOwner {91        escrow = _newEscrow;92    }9394    function setNativeCoin(address _coin) public onlyOwner {95        nativecoin = _coin;96    }9798    modifier onlyEscrow() {99        require(msg.sender == escrow, "Only escrow can");100        _;101    }102103    modifier onlyOwner() {104        require(msg.sender == owner, "Only owner can");105        _;106    }107108    /**109     * Make bids (orders) to sell NFTs110     */111112    receive() external payable {113        revert(114            "Can't accept payment without collection and IDs, use dApp to send"115        );116    }117118    fallback() external payable {119        revert("No such function");120    }121122    event AddedAsk(123        uint256 _price,124        address _currencyCode,125        address _idCollection,126        uint256 _idNFT,127        uint256 orderId128    );129    event EditedAsk(130        uint256 _price,131        address _currencyCode,132        address _idCollection,133        uint256 _idNFT,134        uint8 _active,135        uint256 orderId136    );137138    event CanceledAsk(address _idCollection, uint256 _idNFT, uint256 orderId);139140    event DepositedKSM(uint256 _amount, address _sender);141142    event BoughtNFT4KSM(143        address _idCollection,144        uint256 _idNFT,145        uint256 orderID,146        uint256 orderPrice147    );148149    event BoughtNFT(150        address _idCollection,151        uint256 _idNFT,152        uint256 orderID,153        uint256 orderPrice154    );155156    event WithdrawnAllKSM(address _sender, uint256 balance);157158    event Withdrawn(uint256 _amount, address _currencyCode, address _sender);159160    function addAsk(161        uint256 _price,162        address _currencyCode,163        address _idCollection,164        uint256 _idNFT165    ) public {166        //167        address ownerNFT = UniqueNFT(_idCollection).ownerOf(_idNFT);168        require(ownerNFT == msg.sender, "Only token owner can make ask");169        string memory nameNFT;170        string memory symbolNFT;171        string memory uriNFT;172        try UniqueNFT(_idCollection).name() returns (string memory name_) {173            nameNFT = name_;174        } catch {175            nameNFT = "";176        }177        try UniqueNFT(_idCollection).symbol() returns (string memory symbol_) {178            symbolNFT = symbol_;179        } catch {180            symbolNFT = "";181        }182        try UniqueNFT(_idCollection).tokenURI(_idNFT) returns (183            string memory uri_184        ) {185            uriNFT = uri_;186        } catch {187            uriNFT = "";188        }189        orders.push(190            Order(191                _idNFT,192                _currencyCode,193                _price,194                block.timestamp,195                _idCollection,196                msg.sender,197                1, // 1 = is active198                nameNFT,199                symbolNFT,200                uriNFT201            )202        );203204        uint256 orderId = orders.length - 1;205        asks[_idCollection][_idNFT] = orderId;206        asksbySeller[msg.sender].push(orderId);207        UniqueNFT(_idCollection).transferFrom(208            msg.sender,209            address(this),210            _idNFT211        );212        emit AddedAsk(_price, _currencyCode, _idCollection, _idNFT, orderId);213    }214215    function editAsk(216        uint256 _price,217        address _currencyCode,218        address _idCollection,219        uint256 _idNFT,220        uint8 _active221    ) public {222        uint256 orderID = asks[_idCollection][_idNFT];223224        require(225            orders[orderID].ownerAddr == msg.sender,226            "Only token owner can edit ask"227        );228        require(orders[orderID].flagActive != 0, "This ask is closed");229        if (_price > 0) {230            orders[orderID].price = _price;231        }232233        if (_currencyCode != address(0)) {234            orders[orderID].currencyCode = _currencyCode;235        }236237        orders[orderID].time = block.timestamp;238        orders[orderID].flagActive = _active;239240        emit EditedAsk(241            _price,242            _currencyCode,243            _idCollection,244            _idNFT,245            _active,246            orderID247        );248    }249250    function cancelAsk(address _idCollection, uint256 _idNFT) public {251        uint256 orderID = asks[_idCollection][_idNFT];252253        require(254            orders[orderID].ownerAddr == msg.sender,255            "Only token owner can edit ask"256        );257        require(orders[orderID].flagActive != 0, "This ask is closed");258259        orders[orderID].time = block.timestamp;260        orders[orderID].flagActive = 0;261        UniqueNFT(_idCollection).transferFrom(262            address(this),263            orders[orderID].ownerAddr,264            _idNFT265        );266        emit CanceledAsk(_idCollection, _idNFT, orderID);267    }268269    function depositKSM(uint256 _amount, address _sender) public onlyEscrow {270        balanceKSM[_sender] = balanceKSM[_sender] + _amount;271        emit DepositedKSM(_amount, _sender);272    }273274    function buyKSM(275        address _idCollection,276        uint256 _idNFT,277        address _buyer,278        address _receiver279    ) public {280        Order memory order = orders[asks[_idCollection][_idNFT]];281        //1. reduce balance282        balanceKSM[_buyer] = balanceKSM[_buyer] - order.price;283        balanceKSM[order.ownerAddr] = balanceKSM[order.ownerAddr] + order.price;284        // 2. close order285        orders[asks[_idCollection][_idNFT]].flagActive = 0;286        // 3. transfer NFT to buyer287        UniqueNFT(_idCollection).transferFrom(address(this), _receiver, _idNFT);288        emit BoughtNFT4KSM(289            _idCollection,290            _idNFT,291            asks[_idCollection][_idNFT],292            order.price293        );294    }295296    function buy(address _idCollection, uint256 _idNFT)297        public298        payable299        returns (bool result)300    {301        //buing for UNQ like as ethers302303        Order memory order = orders[asks[_idCollection][_idNFT]];304        //1. check sent amount and send to seller305        require(306            msg.value == order.price,307            "Not right amount sent, have to be equal price"308        );309        // 2. close order310        orders[asks[_idCollection][_idNFT]].flagActive = 0;311312        // 3. transfer NFT to buyer313        UniqueNFT(_idCollection).transferFrom(314            address(this),315            msg.sender,316            _idNFT317        );318        //uint balance  = address(this).balance;319        result = payable(order.ownerAddr).send(order.price);320        emit BoughtNFT(321            _idCollection,322            _idNFT,323            asks[_idCollection][_idNFT],324            order.price325        );326    }327328    /*329        function buyOther (address _idCollection, uint256 _idNFT, address _currencyCode, uint _amount ) public  { //buy for sny token if seller wants330331            Order memory order = orders[ asks[_idCollection][_idNFT]];332            //1. check sent amount and transfer from buyer to seller333            require (order.price == _amount && order.currencyCode == _currencyCode, "Not right amount or currency sent, have to be equal currency and price" );334            // !!! transfer have to be approved to marketplace!335            IERC20(order.currencyCode).transferFrom(msg.sender, address(this), order.price); //to not disclojure buyer's address336            IERC20(order.currencyCode).transfer(order.ownerAddr, order.price);337            // 2. close order338            orders[ asks[_idCollection][_idNFT]].flagActive = 0;339            // 3. transfer NFT to buyer340            IERC721ext(_idCollection).transferFrom(address(this), msg.sender, _idNFT);341342343        }344    */345346    function withdrawAllKSM(address _sender)347        public348        onlyEscrow349        returns (uint256 lastBalance)350    {351        lastBalance = balanceKSM[_sender];352        balanceKSM[_sender] = 0;353        emit WithdrawnAllKSM(_sender, lastBalance);354    }355356    function withdraw(357        uint256 _amount,358        address _currencyCode,359        address payable _sender360    ) public onlyOwner returns (bool result) {361        if (_currencyCode != nativecoin) {362            //erc20 compat. tokens on UNIQUE chain363            // uint balance = IERC20(_currencyCode).balanceOf(address(this));364            UniqueFungible(_currencyCode).transfer(_sender, _amount);365        } else {366            // uint balance  = address(this).balance;367368            result = (_sender).send(_amount); // for UNQ like as ethers369        }370        emit Withdrawn(_amount, _currencyCode, _sender);371        return result;372    }373374    // event GettedOrder(uint , Order);375    function getOrder(address _idCollection, uint256 _idNFT)376        public377        view378        returns (Order memory)379    {380        uint256 orderId = asks[_idCollection][_idNFT];381        Order memory order = orders[orderId];382        //       emit GettedOrder (orderId, order);383        return order;384    }385386    function getOrdersLen() public view returns (uint256) {387        return orders.length;388    }389}