public void MockChain_NonFungibleToken() { using (PoWMockChain chain = new PoWMockChain(2)) { MockChainNode node1 = chain.Nodes[0]; MockChainNode node2 = chain.Nodes[1]; node1.MineBlocks(1); ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/NonFungibleToken.cs"); Assert.True(compilationResult.Success); // Create contract and ensure code exists BuildCreateContractTransactionResponse response = node1.SendCreateContractTransaction(compilationResult.Compilation, 0); node2.WaitMempoolCount(1); node2.MineBlocks(1); Assert.NotNull(node2.GetCode(response.NewContractAddress)); Assert.NotNull(node1.GetCode(response.NewContractAddress)); string[] parameters = new string[] { this.methodParameterStringSerializer.Serialize(1uL) }; ILocalExecutionResult result = node1.CallContractMethodLocally("OwnerOf", response.NewContractAddress, 0, parameters); uint160 senderAddressUint160 = node1.MinerAddress.Address.ToUint160(node1.CoreNode.FullNode.Network); uint160 returnedAddressUint160 = ((Address)result.Return).ToUint160(); Assert.Equal(senderAddressUint160, returnedAddressUint160); // Send tokenId 1 to a new owner parameters = new string[] { this.methodParameterStringSerializer.Serialize(node1.MinerAddress.Address.ToAddress(node1.CoreNode.FullNode.Network)), this.methodParameterStringSerializer.Serialize(node2.MinerAddress.Address.ToAddress(node1.CoreNode.FullNode.Network)), this.methodParameterStringSerializer.Serialize(1uL) }; BuildCallContractTransactionResponse callResponse = node1.SendCallContractTransaction("TransferFrom", response.NewContractAddress, 0, parameters); node2.WaitMempoolCount(1); node2.MineBlocks(1); parameters = new string[] { this.methodParameterStringSerializer.Serialize(1uL) }; result = node1.CallContractMethodLocally("OwnerOf", response.NewContractAddress, 0, parameters); uint160 receiverAddressUint160 = node2.MinerAddress.Address.ToUint160(node1.CoreNode.FullNode.Network); returnedAddressUint160 = ((Address)result.Return).ToUint160(); Assert.Equal(receiverAddressUint160, returnedAddressUint160); IList <ReceiptResponse> receipts = node1.GetReceipts(response.NewContractAddress, "Transfer"); Assert.Single(receipts); } }
public void SendAndReceiveLocalSmartContractPropertyCallTransactionsUsingController() { using (PoWMockChain chain = new PoWMockChain(2)) { MockChainNode sender = chain.Nodes[0]; MockChainNode receiver = chain.Nodes[1]; int maturity = (int)sender.CoreNode.FullNode.Network.Consensus.CoinbaseMaturity; sender.MineBlocks(maturity + 5); int spendable = GetSpendableBlocks(maturity + 5, maturity); Assert.Equal(Money.COIN * spendable * 50, (long)sender.WalletSpendableBalance); ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/StorageDemo.cs"); Assert.True(compilationResult.Success); ulong gasLimit = SmartContractFormatLogic.GasLimitMaximum / 2; BuildCreateContractTransactionResponse response = sender.SendCreateContractTransaction(compilationResult.Compilation, amount: 0, feeAmount: 0.001M, gasPrice: SmartContractMempoolValidator.MinGasPrice, gasLimit: gasLimit); sender.WaitMempoolCount(1); sender.MineBlocks(1); var localCallResponse = sender.CallContractMethodLocally("Counter", response.NewContractAddress, 0, gasPrice: SmartContractMempoolValidator.MinGasPrice, gasLimit: gasLimit); // Check that the locally executed transaction returns the correct results Assert.Equal(12345, localCallResponse.Return); Assert.False(localCallResponse.Revert); Assert.True(localCallResponse.GasConsumed > 0); Assert.Null(localCallResponse.ErrorMessage); Assert.NotNull(localCallResponse.InternalTransfers); receiver.MineBlocks(2); // Check that the on-chain storage has not changed after mining var counterResult = sender.GetStorageValue(response.NewContractAddress, "Counter"); Assert.Equal(12345, BitConverter.ToInt32(counterResult)); // Call increment and check return value on receipt BuildCallContractTransactionResponse callResponse = sender.SendCallContractTransaction("Increment", response.NewContractAddress, 0); sender.WaitMempoolCount(1); sender.MineBlocks(1); ReceiptResponse receipt = sender.GetReceipt(callResponse.TransactionId.ToString()); Assert.Equal("12346", receipt.ReturnValue); } }