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 }