public void SideChainTransferDifferentAccounts() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var sourceChain = nexus.RootChain; var targetChain = nexus.FindChainByName("privacy"); var symbol = Nexus.FuelTokenSymbol; var sender = KeyPair.Generate(); var receiver = KeyPair.Generate(); var token = nexus.GetTokenInfo(symbol); var originalAmount = UnitConversion.ToBigInteger(10, token.Decimals); var sideAmount = originalAmount / 2; Assert.IsTrue(sideAmount > 0); // Send from Genesis address to "sender" user simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, symbol, originalAmount); simulator.EndBlock(); // verify test user balance var balance = nexus.RootChain.GetTokenBalance(symbol, sender.Address); Assert.IsTrue(balance == originalAmount); var crossFee = UnitConversion.ToBigInteger(0.001m, token.Decimals); // do a side chain send using test user balance from root to account chain simulator.BeginBlock(); var txA = simulator.GenerateSideChainSend(sender, symbol, sourceChain, receiver.Address, targetChain, sideAmount, crossFee); simulator.EndBlock(); var blockA = nexus.RootChain.LastBlock; // finish the chain transfer simulator.BeginBlock(); var txB = simulator.GenerateSideChainSettlement(receiver, nexus.RootChain, targetChain, blockA.Hash); Assert.IsTrue(simulator.EndBlock().Any()); // verify balances var feeB = targetChain.GetTransactionFee(txB); balance = targetChain.GetTokenBalance(symbol, receiver.Address); Assert.IsTrue(balance == sideAmount - feeB); var feeA = sourceChain.GetTransactionFee(txA); var leftoverAmount = originalAmount - (sideAmount + feeA + crossFee); balance = sourceChain.GetTokenBalance(symbol, sender.Address); Assert.IsTrue(balance == leftoverAmount); }
public void NoGasTestSideChainTransfer() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var sourceChain = nexus.RootChain; var targetChain = nexus.FindChainByName("privacy"); var symbol = Nexus.FuelTokenSymbol; var token = nexus.GetTokenInfo(symbol); var sender = KeyPair.Generate(); var receiver = KeyPair.Generate(); var originalAmount = UnitConversion.ToBigInteger(10, token.Decimals); var sideAmount = originalAmount / 2; Assert.IsTrue(sideAmount > 0); // Send from Genesis address to "sender" user simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, symbol, originalAmount); simulator.EndBlock(); // verify test user balance var balance = nexus.RootChain.GetTokenBalance(symbol, sender.Address); Assert.IsTrue(balance == originalAmount); Transaction txA = null, txB = null; try { // do a side chain send using test user balance from root to account chain simulator.BeginBlock(); txA = simulator.GenerateSideChainSend(sender, symbol, sourceChain, receiver.Address, targetChain, originalAmount, 1); simulator.EndBlock(); } catch (Exception e) { Assert.IsNotNull(e); } try { var blockA = nexus.RootChain.LastBlock; // finish the chain transfer simulator.BeginBlock(); txB = simulator.GenerateSideChainSettlement(sender, nexus.RootChain, targetChain, blockA.Hash); Assert.IsTrue(simulator.EndBlock().Any()); } catch (Exception e) { Assert.IsNotNull(e); } // verify balances, receiver should have 0 balance balance = targetChain.GetTokenBalance(symbol, receiver.Address); Assert.IsTrue(balance == 0); }
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 SideChainTransferMultipleSteps() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var sourceChain = nexus.RootChain; var appsChain = nexus.FindChainByName("apps"); var symbol = Nexus.FuelTokenSymbol; var token = nexus.GetTokenInfo(symbol); var sender = KeyPair.Generate(); var receiver = KeyPair.Generate(); var originalAmount = UnitConversion.ToBigInteger(10, token.Decimals); var sideAmount = originalAmount / 2; Assert.IsTrue(sideAmount > 0); var newChainName = "testing"; // Send from Genesis address to "sender" user simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, symbol, originalAmount); simulator.GenerateChain(owner, appsChain, newChainName); simulator.EndBlock(); var targetChain = nexus.FindChainByName(newChainName); // verify test user balance var balance = nexus.RootChain.GetTokenBalance(symbol, sender.Address); Assert.IsTrue(balance == originalAmount); // do a side chain send using test user balance from root to apps chain simulator.BeginBlock(); var txA = simulator.GenerateSideChainSend(sender, symbol, sourceChain, sender.Address, appsChain, sideAmount, 0); var blockA = simulator.EndBlock().FirstOrDefault(); // finish the chain transfer simulator.BeginBlock(); var txB = simulator.GenerateSideChainSettlement(sender, nexus.RootChain, appsChain, blockA.Hash); Assert.IsTrue(simulator.EndBlock().Any()); // we cant transfer the full side amount due to fees // TODO calculate the proper fee values instead of this sideAmount /= 2; var extraFree = UnitConversion.ToBigInteger(0.01m, token.Decimals); // do another side chain send using test user balance from apps to target chain simulator.BeginBlock(); var txC = simulator.GenerateSideChainSend(sender, symbol, appsChain, receiver.Address, targetChain, sideAmount, extraFree); var blockC = simulator.EndBlock().FirstOrDefault(); // finish the chain transfer simulator.BeginBlock(); var txD = simulator.GenerateSideChainSettlement(sender, appsChain, targetChain, blockC.Hash); Assert.IsTrue(simulator.EndBlock().Any()); // TODO verify balances }