public async Task <MessageEnvelope> Withdrawal(KeyPair destination, string amount, ConstellationInfo.Asset asset, bool waitForFinalize = true) { var paymentMessage = new WithdrawalRequest(); var tx = await TransactionHelper.GetWithdrawalTx(keyPair, constellation, destination, amount, asset); paymentMessage.TransactionXdr = tx.ToArray(); var response = (CentaurusResponse)await connection.SendMessage(paymentMessage.CreateEnvelope()); var result = await(waitForFinalize ? response.ResponseTask : response.AcknowledgmentTask); var txResultMessage = result.Message as ITransactionResultMessage; if (txResultMessage is null) { throw new Exception($"Unexpected result type '{result.Message.MessageType}'"); } tx.Sign(keyPair); foreach (var signature in txResultMessage.TxSignatures) { tx.Signatures.Add(signature.ToDecoratedSignature()); } var submitResult = await tx.Submit(constellation); if (!submitResult.IsSuccess()) { logger.Error($"Submit withdrawal failed. Result xdr: {submitResult.ResultXdr}"); } return(result); }
public async Task WithdrawalQuantumTest(double amount, bool hasWithdrawal, bool useFakeSigner, Type excpectedException) { var outputStream = new XdrDataOutputStream(); var txBuilder = new TransactionBuilder(new AccountResponse(TestEnvironment.Client1KeyPair.AccountId, 1)); txBuilder.SetFee(10_000); txBuilder.AddOperation(new PaymentOperation.Builder(TestEnvironment.Client1KeyPair, new AssetTypeNative(), (amount / AssetsHelper.StroopsPerAsset).ToString("0.##########", CultureInfo.InvariantCulture)).SetSourceAccount(TestEnvironment.AlphaKeyPair).Build()); txBuilder.AddTimeBounds(new stellar_dotnet_sdk.TimeBounds(maxTime: DateTimeOffset.UtcNow.AddSeconds(60))); var tx = txBuilder.Build(); stellar_dotnet_sdk.xdr.Transaction.Encode(outputStream, tx.ToXdrV1()); var account = Global.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair); var withdrawal = new WithdrawalRequest { Account = account.Account.Id, RequestId = 1, TransactionXdr = outputStream.ToArray(), AccountWrapper = account }; var envelope = withdrawal.CreateEnvelope(); envelope.Sign(useFakeSigner ? TestEnvironment.Client2KeyPair : TestEnvironment.Client1KeyPair); if (!Global.IsAlpha) { var quantum = new RequestQuantum { Apex = Global.QuantumStorage.CurrentApex + 1, RequestEnvelope = envelope, Timestamp = DateTime.UtcNow.Ticks }; envelope = quantum.CreateEnvelope(); envelope.Sign(TestEnvironment.AlphaKeyPair); } var result = await AssertQuantumHandling(envelope, excpectedException); if (excpectedException == null) { Assert.IsTrue(account.HasPendingWithdrawal); Assert.IsTrue(account.Account.GetBalance(0).Liabilities == amount); } }
public async Task WithdrawalCleanupQuantumTest(double amount, bool useFakeHash, Type excpectedException) { var outputStream = new XdrDataOutputStream(); var txBuilder = new TransactionBuilder(new AccountResponse(TestEnvironment.Client1KeyPair.AccountId, 1)); txBuilder.SetFee(10_000); txBuilder.AddOperation(new PaymentOperation.Builder(TestEnvironment.Client1KeyPair, new AssetTypeNative(), (amount / AssetsHelper.StroopsPerAsset).ToString("0.##########", CultureInfo.InvariantCulture)).SetSourceAccount(TestEnvironment.AlphaKeyPair).Build()); txBuilder.AddTimeBounds(new stellar_dotnet_sdk.TimeBounds(maxTime: DateTimeOffset.UtcNow.AddSeconds(60))); var tx = txBuilder.Build(); stellar_dotnet_sdk.xdr.Transaction.Encode(outputStream, tx.ToXdrV1()); var account = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair); var acc = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair); var withdrawal = new WithdrawalRequest { Account = acc.Account.Id, RequestId = 1, TransactionXdr = outputStream.ToArray(), AccountWrapper = account }; var envelope = withdrawal.CreateEnvelope(); envelope.Sign(TestEnvironment.Client1KeyPair); if (!context.IsAlpha) { var quantum = new RequestQuantum { Apex = context.QuantumStorage.CurrentApex + 1, RequestEnvelope = envelope, Timestamp = DateTime.UtcNow.Ticks }; envelope = quantum.CreateEnvelope(); envelope.Sign(TestEnvironment.AlphaKeyPair); } var result = await AssertQuantumHandling(envelope, null); if (result.Status != ResultStatusCodes.Success) { throw new Exception("Withdrawal creation failed."); } var cleanup = new WithrawalsCleanupQuantum { ExpiredWithdrawal = useFakeHash ? new byte[] { } : tx.Hash(), Apex = context.QuantumStorage.CurrentApex + 1 }; envelope = cleanup.CreateEnvelope(); if (!context.IsAlpha) { cleanup.Timestamp = DateTime.UtcNow.Ticks; envelope = cleanup.CreateEnvelope(); envelope.Sign(TestEnvironment.AlphaKeyPair); } await AssertQuantumHandling(envelope, excpectedException); if (excpectedException == null) { Assert.IsTrue(!account.HasPendingWithdrawal); Assert.AreEqual(account.Account.GetBalance(0).Liabilities, 0); } }
public async Task TxCommitQuantumTest(int cursor, int amount, int asset, Type excpectedException) { context.AppState.State = ApplicationState.Ready; long apex = context.QuantumStorage.CurrentApex; var client1StartBalanceAmount = (long)0; var account1 = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair).Account; var clientAccountBalance = account1.GetBalance(asset); var withdrawalDest = KeyPair.Random(); var txHash = new byte[] { }; if (clientAccountBalance != null && amount > 0) { client1StartBalanceAmount = clientAccountBalance.Amount; context.Constellation.TryFindAssetSettings(asset, out var assetSettings); var account = new stellar_dotnet_sdk.Account(TestEnvironment.Client1KeyPair.AccountId, 1); var txBuilder = new TransactionBuilder(account); txBuilder.SetFee(10_000); txBuilder.AddTimeBounds(new stellar_dotnet_sdk.TimeBounds(DateTimeOffset.UtcNow, new TimeSpan(0, 5, 0))); txBuilder.AddOperation( new PaymentOperation.Builder(withdrawalDest, assetSettings.ToAsset(), Amount.FromXdr(amount).ToString()) .SetSourceAccount((KeyPair)context.Constellation.Vault) .Build() ); var tx = txBuilder.Build(); txHash = tx.Hash(); var txV1 = tx.ToXdrV1(); var txStream = new XdrDataOutputStream(); stellar_dotnet_sdk.xdr.Transaction.Encode(txStream, txV1); var accountWrapper = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair); var withdrawal = new WithdrawalRequest { Account = accountWrapper.Account.Id, TransactionXdr = txStream.ToArray(), RequestId = DateTime.UtcNow.Ticks, AccountWrapper = accountWrapper }; MessageEnvelope quantum = withdrawal.CreateEnvelope(); quantum.Sign(TestEnvironment.Client1KeyPair); if (!context.IsAlpha) { quantum = new RequestQuantum { Apex = ++apex, RequestEnvelope = quantum, Timestamp = DateTime.UtcNow.Ticks }.CreateEnvelope(); quantum.Sign(TestEnvironment.AlphaKeyPair); } //create withdrawal await context.QuantumHandler.HandleAsync(quantum); } var depositAmount = new Random().Next(10, 1000); var ledgerNotification = new TxNotification { TxCursor = (uint)cursor, Payments = new List <PaymentBase> { new Deposit { Amount = depositAmount, Destination = TestEnvironment.Client1KeyPair, Asset = asset }, new Withdrawal { TransactionHash = txHash, PaymentResult = PaymentResults.Success } } }; var ledgerNotificationEnvelope = ledgerNotification.CreateEnvelope(); ledgerNotificationEnvelope.Sign(TestEnvironment.Auditor1KeyPair); var ledgerCommitEnv = new TxCommitQuantum { Source = ledgerNotificationEnvelope, Apex = ++apex }.CreateEnvelope(); if (!context.IsAlpha) { var msg = ((TxCommitQuantum)ledgerCommitEnv.Message); msg.Timestamp = DateTime.UtcNow.Ticks; ledgerCommitEnv = msg.CreateEnvelope().Sign(TestEnvironment.AlphaKeyPair); } await AssertQuantumHandling(ledgerCommitEnv, excpectedException); if (excpectedException == null) { Assert.AreEqual(context.TxCursorManager.TxCursor, ledgerNotification.TxCursor); Assert.AreEqual(account1.GetBalance(asset).Liabilities, 0); Assert.AreEqual(account1.GetBalance(asset).Amount, client1StartBalanceAmount - amount + depositAmount); //acc balance + deposit - withdrawal } }