public void ReduceAvailableSpace() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var testUser = KeyPair.Generate(); var accountBalance = BaseEnergyRatioDivisor * 100; Transaction tx = null; simulator.BeginBlock(); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, Nexus.FuelTokenSymbol, 100000000); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, Nexus.StakingTokenSymbol, accountBalance); simulator.EndBlock(); //----------- //Perform a valid Stake call for minimum staking amount var stakedAmount = BaseEnergyRatioDivisor * 5; var startingSoulBalance = simulator.Nexus.RootChain.GetTokenBalance(Nexus.StakingTokenSymbol, testUser.Address); simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("energy", "Stake", testUser.Address, stakedAmount). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); //----------- //Upload a file var filename = "notAVirus.exe"; var headerSize = (BigInteger)simulator.Nexus.RootChain.InvokeContract("storage", "CalculateRequiredSize", filename, 0); var contentSize = (long)(stakedAmount * KilobytesPerStake * 1024 / 5) - (long)headerSize; var content = new byte[contentSize]; simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("storage", "UploadFile", testUser.Address, filename, contentSize, content, ArchiveFlags.None). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); var usedSpace = (BigInteger)simulator.Nexus.RootChain.InvokeContract("storage", "GetUsedSpace", testUser.Address); Assert.IsTrue(usedSpace == contentSize); //----------- //Time skip 1 day simulator.TimeSkipDays(1); //----------- //Try partial unstake: should succeed var initialStakedAmount = (BigInteger)simulator.Nexus.RootChain.InvokeContract("energy", "GetStake", testUser.Address); var stakeReduction = stakedAmount / 5; startingSoulBalance = simulator.Nexus.RootChain.GetTokenBalance(Nexus.StakingTokenSymbol, testUser.Address); simulator.BeginBlock(); simulator.GenerateCustomTransaction(testUser, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("energy", "Unstake", testUser.Address, stakeReduction). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); var finalStakedAmount = (BigInteger)simulator.Nexus.RootChain.InvokeContract("energy", "GetStake", testUser.Address); Assert.IsTrue(finalStakedAmount == 0); }
public void UnstakeWithStoredFilesFailure() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var testUser = KeyPair.Generate(); var accountBalance = BaseEnergyRatioDivisor * 100; Transaction tx = null; simulator.BeginBlock(); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, Nexus.FuelTokenSymbol, 100000000); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, Nexus.StakingTokenSymbol, accountBalance); simulator.EndBlock(); //----------- //Perform a valid Stake call for minimum staking amount var stakedAmount = BaseEnergyRatioDivisor; var startingSoulBalance = simulator.Nexus.RootChain.GetTokenBalance(Nexus.StakingTokenSymbol, testUser.Address); simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("energy", "Stake", testUser.Address, stakedAmount). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); //----------- //Upload a file var filename = "notAVirus.exe"; var headerSize = CalculateRequiredSize(filename, 0); var contentSize = (long)(stakedAmount * KilobytesPerStake * 1024) - (long)headerSize; var content = new byte[contentSize]; var contentMerkle = new MerkleTree(content); simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("storage", "UploadFile", testUser.Address, filename, contentSize, contentMerkle, ArchiveFlags.None, new byte[0]). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); var usedSpace = (BigInteger)simulator.Nexus.RootChain.InvokeContract("storage", "GetUsedSpace", testUser.Address); Assert.IsTrue(usedSpace == contentSize); //----------- //Time skip 1 day simulator.TimeSkipDays(1); //----------- //Try to unstake everything: should fail due to files still existing for this user var initialStakedAmount = (BigInteger)simulator.Nexus.RootChain.InvokeContract("energy", "GetStake", testUser.Address); var stakeReduction = initialStakedAmount - BaseEnergyRatioDivisor; startingSoulBalance = simulator.Nexus.RootChain.GetTokenBalance(Nexus.StakingTokenSymbol, testUser.Address); Assert.ThrowsException <Exception>(() => { simulator.BeginBlock(); simulator.GenerateCustomTransaction(testUser, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("energy", "Unstake", testUser.Address, stakeReduction). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); }); var finalStakedAmount = (BigInteger)simulator.Nexus.RootChain.InvokeContract("energy", "GetStake", testUser.Address); Assert.IsTrue(initialStakedAmount == finalStakedAmount); usedSpace = (BigInteger)simulator.Nexus.RootChain.InvokeContract("storage", "GetUsedSpace", testUser.Address); }
public void UnstakeAfterUsedSpaceRelease() { var owner = KeyPair.Generate(); var simulator = new ChainSimulator(owner, 1234); var nexus = simulator.Nexus; var testUser = KeyPair.Generate(); var accountBalance = MinimumValidStake * 100; Transaction tx = null; simulator.BeginBlock(); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, Nexus.FuelTokenSymbol, 100000000); simulator.GenerateTransfer(owner, testUser.Address, nexus.RootChain, Nexus.StakingTokenSymbol, accountBalance); simulator.EndBlock(); //----------- //Perform a valid Stake call for minimum staking amount var stakedAmount = MinimumValidStake; var startingSoulBalance = simulator.Nexus.RootChain.GetTokenBalance(Nexus.StakingTokenSymbol, testUser.Address); simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("energy", "Stake", testUser.Address, stakedAmount). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); //----------- //Upload a file var filename = "notAVirus.exe"; var headerSize = CalculateRequiredSize(filename, 0); var contentSize = (long)(stakedAmount / MinimumValidStake * KilobytesPerStake * 1024) - (long)headerSize; var content = new byte[contentSize]; var contentMerkle = new MerkleTree(content); simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("storage", "UploadFile", testUser.Address, filename, contentSize, contentMerkle, ArchiveFlags.None, new byte[0]). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); var usedSpace = simulator.Nexus.RootChain.InvokeContract("storage", "GetUsedSpace", testUser.Address).AsNumber(); Assert.IsTrue(usedSpace == contentSize + headerSize); //----------- //Delete the file simulator.BeginBlock(); tx = simulator.GenerateCustomTransaction(testUser, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("storage", "DeleteFile", testUser.Address, filename). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); usedSpace = simulator.Nexus.RootChain.InvokeContract("storage", "GetUsedSpace", testUser.Address).AsNumber(); Assert.IsTrue(usedSpace == 0); //----------- //Time skip 1 day simulator.TimeSkipDays(1); //----------- //Try to unstake everything: should succeed simulator.BeginBlock(); simulator.GenerateCustomTransaction(testUser, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(testUser.Address, Address.Null, 1, 9999) .CallContract("energy", "Unstake", testUser.Address, stakedAmount). SpendGas(testUser.Address).EndScript()); simulator.EndBlock(); var finalStakedAmount = simulator.Nexus.RootChain.InvokeContract("energy", "GetStake", testUser.Address).AsNumber(); Assert.IsTrue(finalStakedAmount == 0); }