public static void AddAddressesToWallet(Features.Wallet.Wallet wallet, int count) { if (wallet.AccountsRoot.Count == 0) { wallet.AccountsRoot.Add(new AccountRoot(wallet) { CoinType = CoinType.Bitcoin }); } HdAccount account0 = wallet.AddNewAccount((ExtPubKey)null); HdAccount account1 = wallet.AddNewAccount((ExtPubKey)null); for (int i = 0; i < count; i++) { account0.ExternalAddresses.Add(CreateAddress(false, account0, i)); account0.InternalAddresses.Add(CreateAddress(true, account0, i)); account1.ExternalAddresses.Add(CreateAddress(false, account1, i)); account1.InternalAddresses.Add(CreateAddress(true, account1, i)); } }
public void GetHistoryWithValidModelWithoutTransactionSpendingDetailsReturnsWalletHistoryModel() { ulong gasPrice = SmartContractMempoolValidator.MinGasPrice; int vmVersion = 1; var gasLimit = (Stratis.SmartContracts.RuntimeObserver.Gas)(SmartContractFormatLogic.GasLimitMaximum / 2); var contractTxData = new ContractTxData(vmVersion, gasPrice, gasLimit, new byte[] { 0, 1, 2, 3 }); var callDataSerializer = new CallDataSerializer(new ContractPrimitiveSerializer(new SmartContractsRegTest())); var contractCreateScript = new Script(callDataSerializer.Serialize(contractTxData)); string walletName = "myWallet"; HdAddress address = WalletTestsHelpers.CreateAddress(); TransactionData normalTransaction = WalletTestsHelpers.CreateTransaction(new uint256(1), new Money(500000), 1); TransactionData createTransaction = WalletTestsHelpers.CreateTransaction(new uint256(1), new Money(500000), 1); createTransaction.SpendingDetails = new SpendingDetails { BlockHeight = 100, CreationTime = DateTimeOffset.Now, TransactionId = uint256.One, Payments = new List <PaymentDetails> { new PaymentDetails { Amount = new Money(100000), DestinationScriptPubKey = contractCreateScript } } }; address.Transactions.Add(normalTransaction); address.Transactions.Add(createTransaction); var addresses = new List <HdAddress> { address }; Features.Wallet.Wallet wallet = WalletTestsHelpers.CreateWallet(walletName); HdAccount account = wallet.AddNewAccount((ExtPubKey)null); foreach (HdAddress addr in addresses) { account.ExternalAddresses.Add(address); } List <FlatHistory> flat = addresses.SelectMany(s => s.Transactions.Select(t => new FlatHistory { Address = s, Transaction = t })).ToList(); var accountsHistory = new List <AccountHistory> { new AccountHistory { History = flat, Account = account } }; this.walletManager.Setup(w => w.GetHistory(walletName, It.IsAny <string>())).Returns(accountsHistory); this.walletManager.Setup(w => w.GetWallet(walletName)).Returns(wallet); this.walletManager.Setup(w => w.GetAccounts(walletName)).Returns(new List <HdAccount> { account }); var receipt = new Receipt(null, 12345, new Log[0], null, null, null, uint160.Zero, true, null, null, 2, 100000); this.receiptRepository.Setup(x => x.RetrieveMany(It.IsAny <IList <uint256> >())) .Returns(new List <Receipt> { receipt }); this.callDataSerializer.Setup(x => x.Deserialize(It.IsAny <byte[]>())) .Returns(Result.Ok(new ContractTxData(0, 0, (Stratis.SmartContracts.RuntimeObserver.Gas) 0, new uint160(0), null, null))); var controller = new SmartContractWalletController( this.broadcasterManager.Object, this.callDataSerializer.Object, this.connectionManager.Object, this.loggerFactory.Object, this.network, this.receiptRepository.Object, this.walletManager.Object, this.smartContractTransactionService.Object); var request = new GetHistoryRequest { Address = address.Address, WalletName = walletName }; IActionResult result = controller.GetHistory(request); JsonResult viewResult = Assert.IsType <JsonResult>(result); var model = viewResult.Value as IEnumerable <ContractTransactionItem>; Assert.NotNull(model); Assert.Single(model); ContractTransactionItem resultingTransaction = model.ElementAt(0); ContractTransactionItem resultingCreate = model.ElementAt(0); Assert.Equal(ContractTransactionItemType.ContractCreate, resultingTransaction.Type); Assert.Equal(createTransaction.SpendingDetails.TransactionId, resultingTransaction.Hash); Assert.Equal(createTransaction.SpendingDetails.Payments.First().Amount.ToUnit(MoneyUnit.Satoshi), resultingTransaction.Amount); Assert.Equal(uint160.Zero.ToBase58Address(this.network), resultingTransaction.To); Assert.Equal(createTransaction.SpendingDetails.BlockHeight, resultingTransaction.BlockHeight); Assert.Equal((createTransaction.Amount - createTransaction.SpendingDetails.Payments.First().Amount).ToUnit(MoneyUnit.Satoshi), resultingTransaction.TransactionFee); Assert.Equal(receipt.GasPrice * receipt.GasUsed, resultingTransaction.GasFee); }
public void GetHistoryWithValidModelWithSkipAndTakeReturnsWalletHistoryModel() { ulong gasPrice = SmartContractMempoolValidator.MinGasPrice; int vmVersion = 1; var gasLimit = (Stratis.SmartContracts.RuntimeObserver.Gas)(SmartContractFormatLogic.GasLimitMaximum / 2); var contractTxData = new ContractTxData(vmVersion, gasPrice, gasLimit, new byte[] { 0, 1, 2, 3 }); var callDataSerializer = new CallDataSerializer(new ContractPrimitiveSerializer(new SmartContractsRegTest())); var contractCreateScript = new Script(callDataSerializer.Serialize(contractTxData)); string walletName = "myWallet"; HdAddress address = WalletTestsHelpers.CreateAddress(); const int totalHistoryLength = 100; const int toSkip = 10; const int toTake = 10; for (int i = 0; i < totalHistoryLength; i++) { TransactionData createTransaction = WalletTestsHelpers.CreateTransaction(new uint256((ulong)i), new Money(500000), 100 + i); createTransaction.SpendingDetails = new SpendingDetails { BlockHeight = 100 + i, CreationTime = DateTimeOffset.Now, TransactionId = new uint256((ulong)i), Payments = new List <PaymentDetails> { new PaymentDetails { Amount = new Money(100000), DestinationScriptPubKey = contractCreateScript } } }; address.Transactions.Add(createTransaction); } var addresses = new List <HdAddress> { address }; Features.Wallet.Wallet wallet = WalletTestsHelpers.CreateWallet(walletName); HdAccount account = wallet.AddNewAccount((ExtPubKey)null); foreach (HdAddress addr in addresses) { account.ExternalAddresses.Add(addr); } List <FlatHistory> flat = addresses.SelectMany(s => s.Transactions.Select(t => new FlatHistory { Address = s, Transaction = t })).ToList(); var accountsHistory = new List <AccountHistory> { new AccountHistory { History = flat, Account = account } }; this.walletManager.Setup(w => w.GetHistory(walletName, It.IsAny <string>())).Returns(accountsHistory); this.walletManager.Setup(w => w.GetWallet(walletName)).Returns(wallet); this.walletManager.Setup(w => w.GetAccounts(walletName)).Returns(new List <HdAccount> { account }); var receipt = new Receipt(null, 12345, new Log[0], null, null, null, uint160.Zero, true, null, null, 2, 100000); var receiptList = new List <Receipt>(); for (int i = 0; i < totalHistoryLength; i++) { receiptList.Add(receipt); } this.receiptRepository.Setup(x => x.RetrieveMany(It.IsAny <IList <uint256> >())) .Returns(receiptList); this.callDataSerializer.Setup(x => x.Deserialize(It.IsAny <byte[]>())) .Returns(Result.Ok(new ContractTxData(0, 0, (Stratis.SmartContracts.RuntimeObserver.Gas) 0, new uint160(0), null, null))); var controller = new SmartContractWalletController( this.broadcasterManager.Object, this.callDataSerializer.Object, this.connectionManager.Object, this.loggerFactory.Object, this.network, this.receiptRepository.Object, this.walletManager.Object, this.smartContractTransactionService.Object); var request = new GetHistoryRequest { Address = address.Address, WalletName = walletName, Skip = toSkip, Take = toTake }; IActionResult result = controller.GetHistory(request); JsonResult viewResult = Assert.IsType <JsonResult>(result); var model = viewResult.Value as IEnumerable <ContractTransactionItem>; Assert.NotNull(model); Assert.Equal(toTake, model.Count()); Assert.Equal(new uint256(toSkip), model.ElementAt(toTake - 1).Hash); Assert.Equal(new uint256(toSkip + toTake - 1), model.ElementAt(0).Hash); }