public void Check_BalanceOfAndTransfer() { var snapshot = Store.GetSnapshot().Clone(); snapshot.PersistingBlock = new Block() { Index = 1000 }; byte[] from = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, Blockchain.StandbyValidators).ToScriptHash().ToArray(); byte[] to = new byte[20]; UT_NeoToken.Check_Initialize(snapshot, from); var keyCount = snapshot.Storages.GetChangeSet().Count(); var supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(0); // Check unclaim var unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from); unclaim.Value.Should().Be(new BigInteger(800000000000)); unclaim.State.Should().BeTrue(); // Transfer NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.Zero, true).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, from).Should().Be(100_000_000); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(0); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(800000000000); NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(0); // Check unclaim unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from); unclaim.Value.Should().Be(new BigInteger(0)); unclaim.State.Should().BeTrue(); supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(800000000000); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount + 2); // Gas // Transfer keyCount = snapshot.Storages.GetChangeSet().Count(); NativeContract.GAS.Transfer(snapshot, from, to, 800000000000, false).Should().BeFalse(); // Not signed NativeContract.GAS.Transfer(snapshot, from, to, 800000000001, true).Should().BeFalse(); // More than balance NativeContract.GAS.Transfer(snapshot, from, to, 800000000000, true).Should().BeTrue(); // All balance // Balance of NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(800000000000); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(0); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount); // All // Bad inputs NativeContract.GAS.Transfer(snapshot, from, to, BigInteger.MinusOne, true).Should().BeFalse(); NativeContract.GAS.Transfer(snapshot, new byte[19], to, BigInteger.One, false).Should().BeFalse(); NativeContract.GAS.Transfer(snapshot, from, new byte[19], BigInteger.One, false).Should().BeFalse(); }
public void Check_BalanceOfTransferAndBurn() { var snapshot = Store.GetSnapshot().Clone(); snapshot.PersistingBlock = new Block() { Index = 1000 }; byte[] from = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, Blockchain.StandbyValidators).ToScriptHash().ToArray(); byte[] to = new byte[20]; var keyCount = snapshot.Storages.GetChangeSet().Count(); NativeContract.NEO.Initialize(new ApplicationEngine(TriggerType.Application, null, snapshot, 0)); var supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(3000000000000000); // Check unclaim var unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from); unclaim.Value.Should().Be(new BigInteger(600000000000)); unclaim.State.Should().BeTrue(); // Transfer NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.Zero, true).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, from).Should().Be(100_000_000); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(0); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(3000600000000000); NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(0); // Check unclaim unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from); unclaim.Value.Should().Be(new BigInteger(0)); unclaim.State.Should().BeTrue(); supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(3000600000000000); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount + 3); // Gas // Transfer keyCount = snapshot.Storages.GetChangeSet().Count(); NativeContract.GAS.Transfer(snapshot, from, to, 3000600000000000, false).Should().BeFalse(); // Not signed NativeContract.GAS.Transfer(snapshot, from, to, 3000600000000001, true).Should().BeFalse(); // More than balance NativeContract.GAS.Transfer(snapshot, from, to, 3000600000000000, true).Should().BeTrue(); // All balance // Balance of NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(3000600000000000); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(0); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount + 1); // All // Burn var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); keyCount = snapshot.Storages.GetChangeSet().Count(); Assert.ThrowsException <ArgumentOutOfRangeException>(() => NativeContract.GAS.Burn(engine, new UInt160(to), BigInteger.MinusOne)); // Burn more than expected Assert.ThrowsException <InvalidOperationException>(() => NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(3000600000000001))); // Real burn NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(1)); NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(3000599999999999); keyCount.Should().Be(snapshot.Storages.GetChangeSet().Count()); // Burn all NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(3000599999999999)); (keyCount - 1).Should().Be(snapshot.Storages.GetChangeSet().Count()); // Bad inputs NativeContract.GAS.Transfer(snapshot, from, to, BigInteger.MinusOne, true).Should().BeFalse(); NativeContract.GAS.Transfer(snapshot, new byte[19], to, BigInteger.One, false).Should().BeFalse(); NativeContract.GAS.Transfer(snapshot, from, new byte[19], BigInteger.One, false).Should().BeFalse(); }