Пример #1
0
        public void CancelSale_Success()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            var saleInfo = new SaleInfo
            {
                Price  = 100,
                Seller = tokenOwner
            };

            SetSaleInfo(saleInfo);

            SetupMessage(tokenOwner, 0);

            SetupSafeTransferToken(contract, tokenOwner, tokenId, TransferResult.Succeed());

            store.CancelSale(tokenContract, tokenId);

            store.GetSaleInfo(tokenContract, tokenId)
            .Should()
            .Be(default(SaleInfo));

            VerifyLog(new TokenSaleCanceledLog {
                Contract = tokenContract, TokenId = tokenId, Seller = tokenOwner
            });
        }
Пример #2
0
        public void Buy_Token_Buying_Success()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            var saleInfo = new SaleInfo
            {
                Price  = 100,
                Seller = tokenOwner
            };

            SetSaleInfo(saleInfo);

            SetupMessage(buyer, 100);

            SetupSafeTransferToken(contract, buyer, tokenId, TransferResult.Succeed());

            SetupTransfer(tokenOwner, 100, TransferResult.Succeed());

            store.Buy(tokenContract, tokenId);

            VerifyLog(new TokenPurchasedLog {
                Contract = tokenContract, TokenId = tokenId, Seller = tokenOwner, Buyer = buyer
            });

            store.GetSaleInfo(tokenContract, tokenId)
            .Should()
            .Be(default(SaleInfo));
        }
Пример #3
0
        public void OnNonFungibleTokenReceived_Operator_Mint_And_Sell_Token_Success()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            SetupMessage(tokenContract, 0);
            SetupGetOwnerOfToken(TransferResult.Succeed(contract));
            var price      = 5_00_000_000ul;
            var priceBytes = BitConverter.GetBytes(price);

            mSerializer.Setup(m => m.ToUInt64(priceBytes)).Returns(price);


            store.OnNonFungibleTokenReceived(operatorAddress, Address.Zero, tokenId, priceBytes)
            .Should()
            .BeTrue();

            store.GetSaleInfo(tokenContract, tokenId)
            .Should()
            .Be(new SaleInfo {
                Price = price, Seller = operatorAddress
            });

            VerifyLog(new TokenOnSaleLog
            {
                Contract = tokenContract,
                TokenId  = tokenId,
                Seller   = operatorAddress,
                Operator = operatorAddress,
                Price    = price
            });
        }
Пример #4
0
        public void Constructor_Set_Properties_Success()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            Assert.Equal(1ul, store.CreatedAt);
        }
Пример #5
0
        public void Buy_Token_Is_Not_On_Sale_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            store.Invoking(s => s.Buy(tokenContract, tokenId))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The token is not on sale.");
        }
Пример #6
0
        public void CancelSale_Sending_Coins_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            SetupMessage(tokenOwner, 100);

            store.Invoking(s => s.CancelSale(tokenContract, tokenId))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The method is not payable.");
        }
Пример #7
0
        public void OnNonFungibleTokenReceived_Sending_Coins_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            SetupMessage(tokenContract, 10);

            var price = 5_00_000_000ul;

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, BitConverter.GetBytes(price)))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The method is not payable.");
        }
Пример #8
0
        public void OnNonFungibleTokenReceived_GetOwner_Call_Raise_Exception_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            SetupGetOwnerOfToken(TransferResult.Failed());
            SetupMessage(tokenContract, 0);
            var price      = 5_00_000_000ul;
            var priceBytes = BitConverter.GetBytes(price);

            mSerializer.Setup(m => m.ToUInt64(priceBytes)).Returns(price);

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, priceBytes))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("OwnerOf method call failed.");
        }
Пример #9
0
        public void OnNonFungibleTokenReceived_Called_By_None_Contract_Fails()
        {
            SetupMessage(creator, 0);

            state.SetIsContract(tokenContract, false);

            var store = new NFTStore(mContractState.Object);

            SetupMessage(tokenContract, 0);
            var price      = 5_00_000_000ul;
            var priceBytes = BitConverter.GetBytes(price);

            mSerializer.Setup(m => m.ToUInt64(priceBytes)).Returns(price);

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, priceBytes))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The Caller is not a contract.");
        }
Пример #10
0
        public void OnNonFungibleTokenReceived_Selling_Already_OnSale_Token_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            SetupMessage(tokenContract, 0);
            SetupGetOwnerOfToken(TransferResult.Succeed(contract));
            var price      = 5_00_000_000ul;
            var priceBytes = BitConverter.GetBytes(price);

            mSerializer.Setup(m => m.ToUInt64(priceBytes)).Returns(price);

            store.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, priceBytes);

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, priceBytes))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The token is already on sale.");
        }
Пример #11
0
        public void Buy_Transferred_Amount_Deos_Not_Match_Token_Price_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            var saleInfo = new SaleInfo
            {
                Price  = 100,
                Seller = tokenOwner
            };

            SetSaleInfo(saleInfo);

            SetupMessage(buyer, 90);

            store.Invoking(s => s.Buy(tokenContract, tokenId))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("Transferred amount is not matching exact price of the token.");
        }
Пример #12
0
        public void CancelSale_Called_By_None_Token_Owner_Or_Operator_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            var saleInfo = new SaleInfo
            {
                Price  = 100,
                Seller = tokenOwner
            };

            SetSaleInfo(saleInfo);

            SetupMessage(attacker, 0);
            SetupIsApprovedForAll(tokenOwner, attacker, TransferResult.Succeed(false));

            store.Invoking(s => s.CancelSale(tokenContract, tokenId))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The caller is not owner of the token nor approved for all.");
        }
Пример #13
0
        public void CancelSale_SafeTokenTransfer_Returns_False_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTStore(mContractState.Object);

            var saleInfo = new SaleInfo
            {
                Price  = 100,
                Seller = tokenOwner
            };

            SetSaleInfo(saleInfo);

            SetupMessage(tokenOwner, 0);

            SetupSafeTransferToken(contract, tokenOwner, tokenId, TransferResult.Failed());

            store.Invoking(s => s.CancelSale(tokenContract, tokenId))
            .Should()
            .Throw <SmartContractAssertException>()
            .WithMessage("The token transfer failed.");
        }