public async Task Check_BalanceOfTransferAndBurn() { var snapshot = _snapshot.CreateSnapshot(); var persistingBlock = new Block { Header = new Header { Index = 1000 } }; byte[] from = Contract.GetBFTAddress(ProtocolSettings.Default.StandbyValidators).ToArray(); byte[] to = new byte[20]; var keyCount = snapshot.GetChangeSet().Count(); var supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(5200000050000000); // 3000000000000000 + 50000000 (neo holder reward) // Check unclaim var unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0.5 * 1000 * 100000000L)); unclaim.State.Should().BeTrue(); // Transfer NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.Zero, true, persistingBlock).Should().BeTrue(); Assert.ThrowsException <ArgumentNullException>(() => NativeContract.NEO.Transfer(snapshot, from, null, BigInteger.Zero, true, persistingBlock)); Assert.ThrowsException <ArgumentNullException>(() => NativeContract.NEO.Transfer(snapshot, null, to, BigInteger.Zero, false, persistingBlock)); NativeContract.NEO.BalanceOf(snapshot, from).Should().Be(100000000); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(0); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(52000500_00000000); NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(0); // Check unclaim unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0)); unclaim.State.Should().BeTrue(); supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(5200050050000000); snapshot.GetChangeSet().Count().Should().Be(keyCount + 3); // Gas // Transfer keyCount = snapshot.GetChangeSet().Count(); NativeContract.GAS.Transfer(snapshot, from, to, 52000500_00000000, false, persistingBlock).Should().BeFalse(); // Not signed NativeContract.GAS.Transfer(snapshot, from, to, 52000500_00000001, true, persistingBlock).Should().BeFalse(); // More than balance NativeContract.GAS.Transfer(snapshot, from, to, 52000500_00000000, true, persistingBlock).Should().BeTrue(); // All balance // Balance of NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(52000500_00000000); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(0); snapshot.GetChangeSet().Count().Should().Be(keyCount + 1); // All // Burn using var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, persistingBlock, settings: TestBlockchain.TheNeoSystem.Settings, gas: 0); engine.LoadScript(Array.Empty <byte>()); await Assert.ThrowsExceptionAsync <ArgumentOutOfRangeException>(async() => await NativeContract.GAS.Burn(engine, new UInt160(to), BigInteger.MinusOne)); // Burn more than expected await Assert.ThrowsExceptionAsync <InvalidOperationException>(async() => await NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(52000500_00000001))); // Real burn await NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(1)); NativeContract.GAS.BalanceOf(engine.Snapshot, to).Should().Be(5200049999999999); engine.Snapshot.GetChangeSet().Count().Should().Be(2); // Burn all await NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(5200049999999999)); (keyCount - 1).Should().Be(engine.Snapshot.GetChangeSet().Count()); // Bad inputs Assert.ThrowsException <ArgumentOutOfRangeException>(() => NativeContract.GAS.Transfer(engine.Snapshot, from, to, BigInteger.MinusOne, true, persistingBlock)); Assert.ThrowsException <FormatException>(() => NativeContract.GAS.Transfer(engine.Snapshot, new byte[19], to, BigInteger.One, false, persistingBlock)); Assert.ThrowsException <FormatException>(() => NativeContract.GAS.Transfer(engine.Snapshot, from, new byte[19], BigInteger.One, false, persistingBlock)); }
public void Check_BalanceOfTransferAndBurn() { var snapshot = _snapshot.CreateSnapshot(); var persistingBlock = new Block { Header = new Header { Index = 1000 } }; byte[] from = Contract.GetBFTAddress(Blockchain.StandbyValidators).ToArray(); byte[] to = new byte[20]; var keyCount = snapshot.GetChangeSet().Count(); var supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(3000000050000000); // 3000000000000000 + 50000000 (neo holder reward) // Check unclaim var unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0.5 * 1000 * 100000000L)); unclaim.State.Should().BeTrue(); // Transfer NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.Zero, true, persistingBlock).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, from).Should().Be(100000000); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(0); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(30000500_00000000); NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(0); // Check unclaim unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0)); unclaim.State.Should().BeTrue(); supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(3000050050000000); snapshot.GetChangeSet().Count().Should().Be(keyCount + 3); // Gas // Transfer keyCount = snapshot.GetChangeSet().Count(); NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000000, false, persistingBlock).Should().BeFalse(); // Not signed NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000001, true, persistingBlock).Should().BeFalse(); // More than balance NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000000, true, persistingBlock).Should().BeTrue(); // All balance // Balance of NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(30000500_00000000); NativeContract.GAS.BalanceOf(snapshot, from).Should().Be(0); snapshot.GetChangeSet().Count().Should().Be(keyCount + 1); // All // Burn using var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, persistingBlock, 0); keyCount = snapshot.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(30000500_00000001))); // Real burn NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(1)); NativeContract.GAS.BalanceOf(snapshot, to).Should().Be(3000049999999999); keyCount.Should().Be(snapshot.GetChangeSet().Count()); // Burn all NativeContract.GAS.Burn(engine, new UInt160(to), new BigInteger(3000049999999999)); (keyCount - 1).Should().Be(snapshot.GetChangeSet().Count()); // Bad inputs NativeContract.GAS.Transfer(snapshot, from, to, BigInteger.MinusOne, true, persistingBlock).Should().BeFalse(); NativeContract.GAS.Transfer(snapshot, new byte[19], to, BigInteger.One, false, persistingBlock).Should().BeFalse(); NativeContract.GAS.Transfer(snapshot, from, new byte[19], BigInteger.One, false, persistingBlock).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(); }