public void NftBurn() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var chain = nexus.RootChain; var symbol = "COOL"; var testUser = KeyPair.Generate(); // Create the token CoolToken as an NFT simulator.BeginBlock(); simulator.GenerateToken(owner, symbol, "CoolToken", 0, 0, Blockchain.Tokens.TokenFlags.None); simulator.EndBlock(); // Send some SOUL to the test user (required for gas used in "burn" transaction) simulator.BeginBlock(); simulator.GenerateTransfer(owner, testUser.Address, chain, Nexus.FuelTokenSymbol, UnitConversion.ToBigInteger(1, Nexus.FuelTokenDecimals)); simulator.EndBlock(); var token = simulator.Nexus.GetTokenInfo(symbol); var tokenData = new byte[] { 0x1, 0x3, 0x3, 0x7 }; Assert.IsTrue(nexus.TokenExists(symbol), "Can't find the token symbol"); // verify nft presence on the user pre-mint var ownedTokenList = chain.GetTokenOwnerships(symbol).Get(chain.Storage, testUser.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the user already have a CoolToken?"); // Mint a new CoolToken directly on the user simulator.BeginBlock(); simulator.GenerateNft(owner, testUser.Address, chain, symbol, tokenData, new byte[0]); simulator.EndBlock(); // verify nft presence on the user post-mint ownedTokenList = chain.GetTokenOwnerships(symbol).Get(chain.Storage, testUser.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the user not have one now?"); //verify that the present nft is the same we actually tried to create var tokenId = ownedTokenList.ElementAt(0); var nft = nexus.GetNFT(symbol, tokenId); Assert.IsTrue(nft.ROM.SequenceEqual(tokenData) || nft.RAM.SequenceEqual(tokenData), "And why is this NFT different than expected? Not the same data"); // burn the token simulator.BeginBlock(); simulator.GenerateNftBurn(testUser, chain, symbol, tokenId); simulator.EndBlock(); //verify the user no longer has the token ownedTokenList = chain.GetTokenOwnerships(symbol).Get(chain.Storage, testUser.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the user still have it post-burn?"); }
public void NftMint() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var chain = nexus.RootChain; var symbol = "COOL"; var testUser = KeyPair.Generate(); // Create the token CoolToken as an NFT simulator.BeginBlock(); simulator.GenerateToken(owner, symbol, "CoolToken", 0, 0, Blockchain.Tokens.TokenFlags.None); simulator.EndBlock(); var token = simulator.Nexus.GetTokenInfo(symbol); Assert.IsTrue(nexus.TokenExists(symbol), "Can't find the token symbol"); // verify nft presence on the user pre-mint var ownerships = new OwnershipSheet(symbol); var ownedTokenList = ownerships.Get(chain.Storage, testUser.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the sender already have a CoolToken?"); var tokenROM = new byte[] { 0x1, 0x3, 0x3, 0x7 }; var tokenRAM = new byte[] { 0x1, 0x4, 0x4, 0x6 }; // Mint a new CoolToken directly on the user simulator.BeginBlock(); simulator.GenerateNft(owner, testUser.Address, symbol, tokenROM, tokenRAM); simulator.EndBlock(); // verify nft presence on the user post-mint ownedTokenList = ownerships.Get(chain.Storage, testUser.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the sender not have one now?"); //verify that the present nft is the same we actually tried to create var tokenId = ownedTokenList.ElementAt(0); var nft = nexus.GetNFT(symbol, tokenId); Assert.IsTrue(nft.ROM.SequenceEqual(tokenROM) && nft.RAM.SequenceEqual(tokenRAM), "And why is this NFT different than expected? Not the same data"); var currentSupply = nexus.GetTokenSupply(chain.Storage, symbol); Assert.IsTrue(currentSupply == 1, "why supply did not increase?"); }
public void CreateNonDivisibleToken() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var accountChain = nexus.FindChainByName("account"); var symbol = "BLA"; var tokenSupply = UnitConversion.ToBigInteger(100000000, 18); simulator.BeginBlock(); simulator.GenerateToken(owner, symbol, "BlaToken", tokenSupply, 0, TokenFlags.Transferable | TokenFlags.Fungible | TokenFlags.Finite); simulator.MintTokens(owner, symbol, tokenSupply); simulator.EndBlock(); var token = nexus.GetTokenInfo(symbol); var testUser = KeyPair.Generate(); var amount = UnitConversion.ToBigInteger(2, token.Decimals); var oldBalance = nexus.RootChain.GetTokenBalance(symbol, owner.Address); Assert.IsTrue(oldBalance > amount); // Send from Genesis address to test user simulator.BeginBlock(); var tx = simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, symbol, amount); simulator.EndBlock(); // verify test user balance var transferBalance = nexus.RootChain.GetTokenBalance(symbol, testUser.Address); Assert.IsTrue(transferBalance == amount); var newBalance = nexus.RootChain.GetTokenBalance(symbol, owner.Address); Assert.IsTrue(transferBalance + newBalance == oldBalance); }
public void SidechainNftTransfer() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var sourceChain = nexus.RootChain; var targetChain = nexus.FindChainByName("privacy"); var nftSymbol = "COOL"; var sender = KeyPair.Generate(); var receiver = KeyPair.Generate(); var fullAmount = UnitConversion.ToBigInteger(10, Nexus.FuelTokenDecimals); var smallAmount = fullAmount / 2; Assert.IsTrue(smallAmount > 0); // Send some SOUL to the test user (required for gas used in "transfer" transaction) simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, sourceChain, Nexus.FuelTokenSymbol, fullAmount); simulator.EndBlock(); // Create the token CoolToken as an NFT simulator.BeginBlock(); simulator.GenerateToken(owner, nftSymbol, "CoolToken", 0, 0, TokenFlags.Transferable); simulator.EndBlock(); var token = simulator.Nexus.GetTokenInfo(nftSymbol); var tokenData = new byte[] { 0x1, 0x3, 0x3, 0x7 }; Assert.IsTrue(nexus.TokenExists(nftSymbol), "Can't find the token symbol"); // verify nft presence on the sender pre-mint var ownerships = new OwnershipSheet(nftSymbol); var ownedTokenList = ownerships.Get(sourceChain.Storage, sender.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the sender already have a CoolToken?"); // Mint a new CoolToken directly on the sender simulator.BeginBlock(); simulator.GenerateNft(owner, sender.Address, nftSymbol, tokenData, new byte[0]); simulator.EndBlock(); // verify nft presence on the sender post-mint ownedTokenList = ownerships.Get(sourceChain.Storage, sender.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the sender not have one now?"); //verify that the present nft is the same we actually tried to create var tokenId = ownedTokenList.ElementAt(0); var nft = nexus.GetNFT(nftSymbol, tokenId); Assert.IsTrue(nft.ROM.SequenceEqual(tokenData) || nft.RAM.SequenceEqual(tokenData), "And why is this NFT different than expected? Not the same data"); // verify nft presence on the receiver pre-transfer ownedTokenList = ownerships.Get(targetChain.Storage, receiver.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the receiver already have a CoolToken?"); var extraFee = UnitConversion.ToBigInteger(0.001m, Nexus.FuelTokenDecimals); // transfer that nft from sender to receiver simulator.BeginBlock(); simulator.GenerateSideChainSend(sender, Nexus.FuelTokenSymbol, sourceChain, receiver.Address, targetChain, smallAmount, extraFee); var txA = simulator.GenerateNftSidechainTransfer(sender, receiver.Address, sourceChain, targetChain, nftSymbol, tokenId); simulator.EndBlock(); var blockA = nexus.RootChain.LastBlock; // finish the chain transfer simulator.BeginBlock(); simulator.GenerateSideChainSettlement(receiver, nexus.RootChain, targetChain, blockA.Hash); Assert.IsTrue(simulator.EndBlock().Any()); // verify the sender no longer has it ownedTokenList = ownerships.Get(sourceChain.Storage, sender.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the sender still have one?"); // verify nft presence on the receiver post-transfer ownedTokenList = ownerships.Get(targetChain.Storage, receiver.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the receiver not have one now?"); //verify that the transfered nft is the same we actually tried to create tokenId = ownedTokenList.ElementAt(0); nft = nexus.GetNFT(nftSymbol, tokenId); Assert.IsTrue(nft.ROM.SequenceEqual(tokenData) || nft.RAM.SequenceEqual(tokenData), "And why is this NFT different than expected? Not the same data"); }
public void TestMarketContract() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var chain = nexus.RootChain; var nftSymbol = "COOL"; var testUser = KeyPair.Generate(); // Create the token CoolToken as an NFT simulator.BeginBlock(); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, nexus.FuelToken, 1000000); simulator.GenerateToken(owner, nftSymbol, "CoolToken", 0, 0, Blockchain.Tokens.TokenFlags.Transferable); simulator.EndBlock(); var token = simulator.Nexus.FindTokenBySymbol(nftSymbol); Assert.IsTrue(token != null, "Can't find the token symbol"); // verify nft presence on the user pre-mint var ownedTokenList = chain.GetTokenOwnerships(token).Get(testUser.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the sender already have a CoolToken?"); var tokenROM = new byte[] { 0x1, 0x3, 0x3, 0x7 }; var tokenRAM = new byte[] { 0x1, 0x4, 0x4, 0x6 }; // Mint a new CoolToken directly on the user simulator.BeginBlock(); simulator.GenerateNft(owner, testUser.Address, chain, token, tokenROM, tokenRAM); simulator.EndBlock(); var auctions = (MarketAuction[])simulator.Nexus.RootChain.InvokeContract("market", "GetAuctions"); var previousAuctionCount = auctions.Length; // verify nft presence on the user post-mint ownedTokenList = chain.GetTokenOwnerships(token).Get(testUser.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the sender not have one now?"); var tokenID = ownedTokenList.First(); var price = 1000; Timestamp endDate = Timestamp.Now + TimeSpan.FromDays(2); simulator.BeginBlock(); simulator.GenerateCustomTransaction(testUser, () => ScriptUtils. BeginScript(). AllowGas(testUser.Address, Address.Null, 1, 9999). CallContract("market", "SellToken", testUser.Address, token.Symbol, Nexus.FuelTokenSymbol, tokenID, price, endDate). SpendGas(testUser.Address). EndScript() ); simulator.EndBlock(); auctions = (MarketAuction[])simulator.Nexus.RootChain.InvokeContract("market", "GetAuctions"); Assert.IsTrue(auctions.Length == 1 + previousAuctionCount, "auction ids missing"); simulator.BeginBlock(); simulator.GenerateCustomTransaction(owner, () => ScriptUtils. BeginScript(). AllowGas(owner.Address, Address.Null, 1, 9999). CallContract("market", "BuyToken", owner.Address, token.Symbol, auctions[previousAuctionCount].TokenID). SpendGas(owner.Address). EndScript() ); simulator.EndBlock(); auctions = (MarketAuction[])simulator.Nexus.RootChain.InvokeContract("market", "GetAuctions"); Assert.IsTrue(auctions.Length == previousAuctionCount, "auction ids should be empty at this point"); // verify that the nft was really moved ownedTokenList = chain.GetTokenOwnerships(token).Get(testUser.Address); Assert.IsTrue(ownedTokenList.Count() == 0, "How does the seller still have one?"); ownedTokenList = chain.GetTokenOwnerships(token).Get(owner.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the buyer does not have what he bought?"); }
public void NftTransfer() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var chain = nexus.RootChain; var nftKey = KeyPair.Generate(); var nftSymbol = "COOL"; var nftName = "CoolToken"; var sender = KeyPair.Generate(); var receiver = KeyPair.Generate(); // Send some SOUL to the test user (required for gas used in "transfer" transaction) simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, chain, simulator.Nexus.FuelToken, UnitConversion.ToBigInteger(1, Nexus.FuelTokenDecimals)); simulator.EndBlock(); // Create the token CoolToken as an NFT simulator.BeginBlock(); simulator.GenerateToken(owner, nftSymbol, nftName, 0, 0, Blockchain.Tokens.TokenFlags.None); simulator.EndBlock(); var token = simulator.Nexus.FindTokenBySymbol(nftSymbol); var tokenData = new byte[] { 0x1, 0x3, 0x3, 0x7 }; Assert.IsTrue(token != null, "Can't find the token symbol"); // verify nft presence on the sender pre-mint var ownedTokenList = chain.GetTokenOwnerships(token).Get(sender.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the sender already have a CoolToken?"); // Mint a new CoolToken directly on the sender simulator.BeginBlock(); simulator.GenerateNft(owner, sender.Address, chain, token, tokenData, new byte[0]); simulator.EndBlock(); // verify nft presence on the sender post-mint ownedTokenList = chain.GetTokenOwnerships(token).Get(sender.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the sender not have one now?"); //verify that the present nft is the same we actually tried to create var tokenId = ownedTokenList.ElementAt(0); var nft = nexus.GetNFT(token, tokenId); Assert.IsTrue(nft.ROM.SequenceEqual(tokenData) || nft.RAM.SequenceEqual(tokenData), "And why is this NFT different than expected? Not the same data"); // verify nft presence on the receiver pre-transfer ownedTokenList = chain.GetTokenOwnerships(token).Get(receiver.Address); Assert.IsTrue(!ownedTokenList.Any(), "How does the receiver already have a CoolToken?"); // transfer that nft from sender to receiver simulator.BeginBlock(); var txA = simulator.GenerateNftTransfer(sender, receiver.Address, chain, token, tokenId); simulator.EndBlock(); // verify nft presence on the receiver post-transfer ownedTokenList = chain.GetTokenOwnerships(token).Get(receiver.Address); Assert.IsTrue(ownedTokenList.Count() == 1, "How does the receiver not have one now?"); //verify that the transfered nft is the same we actually tried to create tokenId = ownedTokenList.ElementAt(0); nft = nexus.GetNFT(token, tokenId); Assert.IsTrue(nft.ROM.SequenceEqual(tokenData) || nft.RAM.SequenceEqual(tokenData), "And why is this NFT different than expected? Not the same data"); }
public void TestNachoPurchase() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var tokenSupply = ToBigInteger(69931640.63m, NACHO_TOKEN_DECIMALS); simulator.BeginBlock(); simulator.GenerateToken(owner, NACHO_SYMBOL, NACHO_SYMBOL, Nexus.PlatformName, Hash.FromString(NACHO_SYMBOL), tokenSupply, NACHO_TOKEN_DECIMALS, Fungible | Transferable | Finite | Divisible); simulator.MintTokens(owner, owner.Address, NACHO_SYMBOL, tokenSupply); simulator.EndBlock(); var buyer = KeyPair.Generate(); var receiver = KeyPair.Generate(); var nexus = simulator.Nexus; simulator.BeginBlock(); simulator.GenerateTransfer(owner, buyer.Address, nexus.RootChain, FuelTokenSymbol, 100000000); simulator.MintTokens(owner, owner.Address, FiatTokenSymbol, new BigInteger("1000000000000000000000000000000000000000000000000", 10) * GetUnitValue(FiatTokenDecimals)); //simulator.GenerateTransfer(owner, buyer.Address, nexus.RootChain, Nexus.FiatTokenSymbol, 1000000 * UnitConversion.GetUnitValue(Nexus.FiatTokenDecimals)); simulator.EndBlock(); var ownerFiat = simulator.Nexus.RootChain.GetTokenBalance(Nexus.FiatTokenSymbol, owner.Address); decimal requiredMoney = 0; for (int stage = 0; stage < stageCount; stage++) { for (int milestone = 1; milestone <= milestoneCount; milestone++) { decimal milestoneTokens = stageTokenAmount[stage] * milestone / 10m; milestoneTokens = Math.Round(milestoneTokens, 2, AwayFromZero); decimal milestoneTokensPerUsd = stageTokensPerUsd[stage] * tokenDecreaseFactor[stage]; milestoneTokensPerUsd = Math.Round(milestoneTokensPerUsd, 3, AwayFromZero); requiredMoney += milestoneTokens / milestoneTokensPerUsd; Assert.IsTrue(requiredMoney >= 500, "unexpected order size: not enough for 40% bonus"); requiredMoney = requiredMoney / 1.4m; var bigintMoney = ToBigInteger(requiredMoney, FiatTokenDecimals); simulator.BeginBlock(); simulator.GenerateTransfer(owner, buyer.Address, nexus.RootChain, FiatTokenSymbol, bigintMoney); simulator.EndBlock(); var initialNachos = simulator.Nexus.RootChain.GetTokenBalance(NACHO_SYMBOL, receiver.Address); var initialFiat = simulator.Nexus.RootChain.GetTokenBalance(Nexus.FiatTokenSymbol, receiver.Address); simulator.BeginBlock(); simulator.GenerateCustomTransaction(buyer, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(buyer.Address, Address.Null, 1, 9999) .CallContract("nacho", "BuyInApp", buyer.Address, FiatTokenSymbol, bigintMoney). SpendGas(buyer.Address).EndScript()); simulator.EndBlock(); var finalNachos = simulator.Nexus.RootChain.GetTokenBalance(NACHO_SYMBOL, receiver.Address); var finalFiat = simulator.Nexus.RootChain.GetTokenBalance(Nexus.FiatTokenSymbol, receiver.Address); var milestoneTokensBigInt = ToBigInteger(milestoneTokens, NACHO_TOKEN_DECIMALS); Assert.IsTrue(finalNachos == initialNachos + milestoneTokensBigInt); Assert.IsTrue(finalFiat == initialFiat - bigintMoney); } } }