public void TestInvalidTimestamp() { var test = CreateAPI(); var simulator = test.simulator; var owner = test.owner; var sender = PhantasmaKeys.Generate(); var node = PhantasmaKeys.FromWIF(nodeWIF); var nexus = simulator.Nexus; var api = test.api; var random = new Random(); simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, DomainSettings.FuelTokenSymbol, RelayFeePerMessage * 100); simulator.EndBlock(); TopUpChannel(simulator, sender, RelayFeePerMessage * 10); var script = new byte[20]; random.NextBytes(script); var message = new RelayMessage { nexus = "invalid nexus", index = 0, receiver = node.Address, script = script, sender = sender.Address, timestamp = DateTime.Now.AddYears(200) }; var receipt = RelayReceipt.FromMessage(message, sender); string serializedHex = Base16.Encode(receipt.Serialize()); api.RelaySend(serializedHex); Assert.ThrowsException <ChainException>(() => { simulator.BeginBlock(); var tx = simulator.GenerateCustomTransaction(sender, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(sender.Address, Address.Null, 1, 9999) .CallContract("relay", nameof(RelayContract.SettleChannel), receipt). SpendGas(sender.Address).EndScript()); simulator.EndBlock(); }, "should have thrown exception due to wrong nexus name"); }
public void TestSendReceive() { var test = CreateAPI(); var simulator = test.simulator; var owner = test.owner; var sender = PhantasmaKeys.Generate(); var receiver = PhantasmaKeys.Generate(); var node = PhantasmaKeys.FromWIF(nodeWIF); var nexus = simulator.Nexus; var api = test.api; simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, DomainSettings.FuelTokenSymbol, 100000000); simulator.EndBlock(); var desiredChannelBalance = RelayFeePerMessage * 10; TopUpChannel(simulator, sender, desiredChannelBalance); var channelBalance = nexus.RootChain.InvokeContract(simulator.Nexus.RootStorage, "relay", "GetBalance", sender.Address).AsNumber(); Assert.IsTrue(channelBalance == desiredChannelBalance); var messageCount = 5; var messages = new RelayMessage[messageCount]; var random = new Random(); for (int i = 0; i < messageCount; i++) { var script = new byte[100]; random.NextBytes(script); var message = new RelayMessage { nexus = nexus.Name, index = i, receiver = receiver.Address, //node.Address, script = script, sender = sender.Address, timestamp = Timestamp.Now }; messages[i] = message; var receipt = RelayReceipt.FromMessage(message, sender); string serializedHex = Base16.Encode(receipt.Serialize()); api.RelaySend(serializedHex); } var receipts = (ArrayResult)api.RelayReceive(receiver.Address.Text); Assert.IsTrue(receipts.values.Length == messageCount); for (int i = 0; i < messageCount; i++) { var obj = receipts.values[i]; Assert.IsTrue(obj is ReceiptResult); var receiptResult = (ReceiptResult)obj; Assert.IsTrue(receiptResult.nexus == messages[i].nexus); Assert.IsTrue(new BigInteger(receiptResult.index, 10) == messages[i].index); //Assert.IsTrue(receiptResult.receiver == messages[i].receiver); //Assert.IsTrue(receiptResult.script == messages[i].script); //Assert.IsTrue(receiptResult.sender == messages[i].sender); Assert.IsTrue(receiptResult.timestamp == messages[i].timestamp); } }
public void TestIndexGap() { var test = CreateAPI(); var simulator = test.simulator; var owner = test.owner; var sender = PhantasmaKeys.Generate(); var receiver = PhantasmaKeys.Generate(); var node = PhantasmaKeys.FromWIF(nodeWIF); var nexus = simulator.Nexus; var api = test.api; var contractAddress = SmartContract.GetAddressForName("relay"); simulator.BeginBlock(); simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, DomainSettings.FuelTokenSymbol, 100000000); simulator.EndBlock(); TopUpChannel(simulator, sender, 1000000); var indexGap = 5; var messageCount = 3; var messages = new RelayMessage[messageCount]; var random = new Random(); for (int i = 0; i < messageCount; i++) { var script = new byte[100]; random.NextBytes(script); var message = new RelayMessage { nexus = nexus.Name, index = i * indexGap, receiver = receiver.Address, //node.Address, script = script, sender = sender.Address, timestamp = Timestamp.Now }; messages[i] = message; var receipt = RelayReceipt.FromMessage(message, sender); string serializedHex = Base16.Encode(receipt.Serialize()); api.RelaySend(serializedHex); } var receipts = (ArrayResult)api.RelayReceive(receiver.Address.Text); Assert.IsTrue(receipts.values.Length == messageCount); for (int i = 0; i < messageCount; i++) { var obj = receipts.values[i]; Assert.IsTrue(obj is ReceiptResult); var receiptResult = (ReceiptResult)obj; Assert.IsTrue(receiptResult.nexus == messages[i].nexus); Assert.IsTrue(new BigInteger(receiptResult.index, 10) == messages[i].index); //Assert.IsTrue(receiptResult.receiver == messages[i].receiver); //Assert.IsTrue(receiptResult.script == messages[i].script); //Assert.IsTrue(receiptResult.sender == messages[i].sender); Assert.IsTrue(receiptResult.timestamp == messages[i].timestamp); } var lastMessage = messages[messageCount - 1]; var lastReceipt = RelayReceipt.FromMessage(lastMessage, sender); var fuelToken = simulator.Nexus.GetTokenInfo(simulator.Nexus.RootStorage, DomainSettings.FuelTokenSymbol); var senderInitialBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, sender.Address); var chainInitialBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, contractAddress); var receiverInitialBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, node.Address); simulator.BeginBlock(); var tx = simulator.GenerateCustomTransaction(sender, ProofOfWork.None, () => ScriptUtils.BeginScript().AllowGas(sender.Address, Address.Null, 1, 9999) .CallContract("relay", nameof(RelayContract.SettleChannel), lastReceipt). SpendGas(sender.Address).EndScript()); simulator.EndBlock(); var txCost = simulator.Nexus.RootChain.GetTransactionFee(tx); var senderFinalBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, sender.Address); var chainFinalBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, contractAddress); var receiverFinalBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, receiver.Address); var expectedFee = RelayFeePerMessage * (lastReceipt.message.index + 1); Assert.IsTrue(senderFinalBalance == senderInitialBalance - txCost); Assert.IsTrue(receiverFinalBalance == receiverInitialBalance + (expectedFee / 2)); Assert.IsTrue(chainFinalBalance == chainInitialBalance - (expectedFee / 2)); //the sender's balance is escrowed in the chain address, so the chain just sends the other half of the fee away to the receiver }