public ContractParameterSerializationTests(PoWMockChainFixture fixture) { this.mockChain = fixture.Chain; this.node1 = this.mockChain.Nodes[0]; this.node2 = this.mockChain.Nodes[1]; this.serializer = new ContractPrimitiveSerializer(this.mockChain.Network); }
public void Test_IsContract_On_InternallyCreatedContract() { using (PoWMockChain chain = new PoWMockChain(2)) { MockChainNode sender = chain.Nodes[0]; MockChainNode receiver = chain.Nodes[1]; sender.MineBlocks(1); ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/ContractCreation.cs"); Assert.True(compilationResult.Success); // Create contract and ensure code exists BuildCreateContractTransactionResponse response = sender.SendCreateContractTransaction(compilationResult.Compilation, 0); receiver.WaitMempoolCount(1); receiver.MineBlocks(2); Assert.NotNull(receiver.GetCode(response.NewContractAddress)); Assert.NotNull(sender.GetCode(response.NewContractAddress)); // Call contract and ensure internal contract was created. BuildCallContractTransactionResponse callResponse = sender.SendCallContractTransaction("CreateCatIsContract", response.NewContractAddress, 0); receiver.WaitMempoolCount(1); receiver.MineBlocks(1); Assert.Equal(1, BitConverter.ToInt32(sender.GetStorageValue(response.NewContractAddress, "CatCounter"))); uint160 lastCreatedCatAddress = new uint160(sender.GetStorageValue(response.NewContractAddress, "LastCreatedCat")); uint160 expectedCreatedCatAddress = this.addressGenerator.GenerateAddress(callResponse.TransactionId, 0); Assert.Equal(expectedCreatedCatAddress, lastCreatedCatAddress); Assert.True(BitConverter.ToBoolean(sender.GetStorageValue(response.NewContractAddress, "IsContract"))); } }
public void CanReserveAndUnreserveUtxosAsync() { using (var chain = new PoWMockChain(2)) { MockChainNode sender = chain.Nodes[0]; // Mine some coins so we have balance int maturity = (int)sender.CoreNode.FullNode.Network.Consensus.CoinbaseMaturity; sender.MineBlocks(maturity + 1); // Compile the Smart Contract ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/StorageDemo.cs"); Assert.True(compilationResult.Success); // Stop the wallet sync manager so that wallet's spendable inputs does not get updated. sender.CoreNode.FullNode.NodeService <IWalletSyncManager>().Stop(); // Send the first transaction var responseOne = sender.SendCreateContractTransaction(compilationResult.Compilation, 0, feeAmount: 0.001M, gasPrice: SmartContractMempoolValidator.MinGasPrice, gasLimit: SmartContractFormatLogic.GasLimitMaximum / 2); Assert.True(responseOne.Success); // Send the second transaction, which should fail as the utxo was already reserved with transaction one. var responseTwo = sender.SendCreateContractTransaction(compilationResult.Compilation, 0, feeAmount: 0.001M, gasPrice: SmartContractMempoolValidator.MinGasPrice, gasLimit: SmartContractFormatLogic.GasLimitMaximum / 2); Assert.Null(responseTwo); // This needs to be done better so that we can check the actual message. } }
public void Test_CatCreation() { using (PoWMockChain chain = new PoWMockChain(2)) { MockChainNode sender = chain.Nodes[0]; MockChainNode receiver = chain.Nodes[1]; sender.MineBlocks(1); ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/ContractCreation.cs"); Assert.True(compilationResult.Success); // Create contract and ensure code exists BuildCreateContractTransactionResponse response = sender.SendCreateContractTransaction(compilationResult.Compilation, 0); receiver.WaitMempoolCount(1); receiver.MineBlocks(2); Assert.NotNull(receiver.GetCode(response.NewContractAddress)); Assert.NotNull(sender.GetCode(response.NewContractAddress)); // Call contract and ensure internal contract was created. BuildCallContractTransactionResponse callResponse = sender.SendCallContractTransaction("CreateCat", response.NewContractAddress, 0); receiver.WaitMempoolCount(1); receiver.MineBlocks(1); Assert.Equal(1, BitConverter.ToInt32(sender.GetStorageValue(response.NewContractAddress, "CatCounter"))); uint160 lastCreatedCatAddress = new uint160(sender.GetStorageValue(response.NewContractAddress, "LastCreatedCat")); uint160 expectedCreatedCatAddress = this.addressGenerator.GenerateAddress(callResponse.TransactionId, 0); Assert.Equal(expectedCreatedCatAddress, lastCreatedCatAddress); // Test that the contract address, event name, and logging values are available in the bloom, from internal create. var scBlockHeader = receiver.GetLastBlock().Header as SmartContractBlockHeader; Assert.True(scBlockHeader.LogsBloom.Test(lastCreatedCatAddress.ToBytes())); Assert.True(scBlockHeader.LogsBloom.Test(Encoding.UTF8.GetBytes("CatCreated"))); Assert.True(scBlockHeader.LogsBloom.Test(BitConverter.GetBytes(0))); // And sanity test that a random value is not available in bloom. Assert.False(scBlockHeader.LogsBloom.Test(Encoding.UTF8.GetBytes("RandomValue"))); // Do a create that should transfer all funds sent now. decimal amount = 20; BuildCallContractTransactionResponse callResponse2 = sender.SendCallContractTransaction("CreateCatWithFunds", response.NewContractAddress, amount); receiver.WaitMempoolCount(1); receiver.MineBlocks(1); // Check created contract has expected balance. lastCreatedCatAddress = new uint160(sender.GetStorageValue(response.NewContractAddress, "LastCreatedCat")); Assert.Equal(amount * Money.COIN, sender.GetContractBalance(lastCreatedCatAddress.ToBase58Address(sender.CoreNode.FullNode.Network))); // Check block has 3 transactions. Coinbase, our tx, and then a condensing tx. var block = receiver.GetLastBlock(); Assert.Equal(3, block.Transactions.Count); // Condensing tx has 1 input and 1 output - FROM: real tx. TO: new contract address. Assert.Single(block.Transactions[2].Inputs); Assert.Single(block.Transactions[2].Outputs); Assert.Equal(block.Transactions[1].GetHash(), block.Transactions[2].Inputs[0].PrevOut.Hash); // References tx above. Assert.Equal(amount * Money.COIN, (ulong)block.Transactions[2].Outputs[0].Value); Assert.True(block.Transactions[2].Inputs[0].ScriptSig.IsSmartContractSpend()); Assert.True(block.Transactions[2].Outputs[0].ScriptPubKey.IsSmartContractInternalCall()); } }
public ContractExecutionFailureTests(PoWMockChainFixture fixture) { this.mockChain = fixture.Chain; this.node1 = this.mockChain.Nodes[0]; this.node2 = this.mockChain.Nodes[1]; this.addressGenerator = new AddressGenerator(); this.senderRetriever = new SenderRetriever(); }
public void Validate_ConstructorLoop() { using (PoWMockChain chain = new PoWMockChain(2)) { MockChainNode sender = chain.Nodes[0]; MockChainNode receiver = chain.Nodes[1]; sender.MineBlocks(1); var byteCode = ContractCompiler.CompileFile("SmartContracts/ConstructorLoop.cs").Compilation; // Create contract and ensure code exists BuildCreateContractTransactionResponse response = sender.SendCreateContractTransaction(byteCode, 0); receiver.WaitMempoolCount(1); receiver.MineBlocks(2); Assert.NotNull(receiver.GetCode(response.NewContractAddress)); Assert.NotNull(sender.GetCode(response.NewContractAddress)); } }