public void TestBuilderFee() { // GBPMKIRA2OQW2XZZQUCQILI5TMVZ6JNRKM423BSAISDM7ZFWQ6KWEBC4 var source = KeyPair.FromSecretSeed("SCH27VUZZ6UAKB67BDNF6FA42YMBMQCBKXWGMFD5TZ6S5ZZCZFLRXKHS"); var destination = KeyPair.FromAccountId("GDW6AUTBXTOC7FIKUO5BOO3OGLK4SF7ZPOBLMQHMZDI45J2Z6VXRB5NR"); var account = new Account(source.AccountId, 2908908335136768L); var transaction = new TransactionBuilder(account) .AddOperation(new CreateAccountOperation.Builder(destination, "2000").Build()) .AddOperation(new CreateAccountOperation.Builder(destination, "2000").Build()) .SetFee(173) .Build(); // Convert transaction to binary XDR and back again to make sure fee is correctly de/serialized. var decodedTransaction = transaction.ToUnsignedEnvelopeXdr().V1.Tx; Assert.AreEqual(decodedTransaction.Fee.InnerValue, 173 * 2U); var transaction2 = Transaction.FromEnvelopeXdr(transaction.ToUnsignedEnvelopeXdr()); Assert.AreEqual(transaction.SourceAccount.AccountId, transaction2.SourceAccount.AccountId); Assert.AreEqual(transaction.SequenceNumber, transaction2.SequenceNumber); Assert.AreEqual(transaction.Memo, transaction2.Memo); Assert.AreEqual(transaction.TimeBounds, transaction2.TimeBounds); Assert.AreEqual(transaction.Fee, transaction2.Fee); Assert.AreEqual( ((CreateAccountOperation)transaction.Operations[0]).StartingBalance, ((CreateAccountOperation)transaction2.Operations[0]).StartingBalance ); Assert.AreEqual( ((CreateAccountOperation)transaction.Operations[1]).StartingBalance, ((CreateAccountOperation)transaction2.Operations[1]).StartingBalance ); }
public void TestBuilderMemoText() { // GBPMKIRA2OQW2XZZQUCQILI5TMVZ6JNRKM423BSAISDM7ZFWQ6KWEBC4 var source = KeyPair.FromSecretSeed("SCH27VUZZ6UAKB67BDNF6FA42YMBMQCBKXWGMFD5TZ6S5ZZCZFLRXKHS"); var destination = KeyPair.FromAccountId("GDW6AUTBXTOC7FIKUO5BOO3OGLK4SF7ZPOBLMQHMZDI45J2Z6VXRB5NR"); var account = new Account(source, 2908908335136768); var transaction = new Transaction.Builder(account) .AddOperation(new CreateAccountOperation.Builder(destination, "2000").Build()) .AddMemo(Memo.Text("Hello world!")) .Build(); transaction.Sign(source); Assert.AreEqual( "AAAAAF7FIiDToW1fOYUFBC0dmyufJbFTOa2GQESGz+S2h5ViAAAAZAAKVaMAAAABAAAAAAAAAAEAAAAMSGVsbG8gd29ybGQhAAAAAQAAAAAAAAAAAAAAAO3gUmG83C+VCqO6FztuMtXJF/l7grZA7MjRzqdZ9W8QAAAABKgXyAAAAAAAAAAAAbaHlWIAAABAxzofBhoayuUnz8t0T1UNWrTgmJ+lCh9KaeOGu2ppNOz9UGw0abGLhv+9oWQsstaHx6YjwWxL+8GBvwBUVWRlBQ==", transaction.ToEnvelopeXdrBase64()); var transaction2 = Transaction.FromEnvelopeXdr(transaction.ToEnvelopeXdr()); Assert.AreEqual(transaction.SourceAccount.AccountId, transaction2.SourceAccount.AccountId); Assert.AreEqual(transaction.SequenceNumber, transaction2.SequenceNumber); Assert.AreEqual(transaction.Memo, transaction2.Memo); Assert.AreEqual(transaction.Fee, transaction2.Fee); Assert.AreEqual( ((CreateAccountOperation)transaction.Operations[0]).StartingBalance, ((CreateAccountOperation)transaction2.Operations[0]).StartingBalance ); }
public void TestBuilderMemoText() { // GBPMKIRA2OQW2XZZQUCQILI5TMVZ6JNRKM423BSAISDM7ZFWQ6KWEBC4 var source = KeyPair.FromSecretSeed("SCH27VUZZ6UAKB67BDNF6FA42YMBMQCBKXWGMFD5TZ6S5ZZCZFLRXKHS"); var destination = KeyPair.FromAccountId("GDW6AUTBXTOC7FIKUO5BOO3OGLK4SF7ZPOBLMQHMZDI45J2Z6VXRB5NR"); var account = new Account(source.AccountId, 2908908335136768); var transaction = new TransactionBuilder(account) .AddOperation(new CreateAccountOperation.Builder(destination, "2000").Build()) .AddMemo(Memo.Text("Hello world!")) .Build(); transaction.Sign(source); Assert.AreEqual( "AAAAAF7FIiDToW1fOYUFBC0dmyufJbFTOa2GQESGz+S2h5ViAAAAZAAKVaMAAAABAAAAAAAAAAEAAAAMSGVsbG8gd29ybGQhAAAAAQAAAAAAAAAAAAAAAO3gUmG83C+VCqO6FztuMtXJF/l7grZA7MjRzqdZ9W8QAAAABKgXyAAAAAAAAAAAAbaHlWIAAABAxzofBhoayuUnz8t0T1UNWrTgmJ+lCh9KaeOGu2ppNOz9UGw0abGLhv+9oWQsstaHx6YjwWxL+8GBvwBUVWRlBQ==", transaction.ToEnvelopeXdrBase64(TransactionBase.TransactionXdrVersion.V0)); Assert.AreEqual( "AAAAAgAAAABexSIg06FtXzmFBQQtHZsrnyWxUzmthkBEhs/ktoeVYgAAAGQAClWjAAAAAQAAAAAAAAABAAAADEhlbGxvIHdvcmxkIQAAAAEAAAAAAAAAAAAAAADt4FJhvNwvlQqjuhc7bjLVyRf5e4K2QOzI0c6nWfVvEAAAAASoF8gAAAAAAAAAAAG2h5ViAAAAQMc6HwYaGsrlJ8/LdE9VDVq04JifpQofSmnjhrtqaTTs/VBsNGmxi4b/vaFkLLLWh8emI8FsS/vBgb8AVFVkZQU=", transaction.ToEnvelopeXdrBase64()); var transaction2 = Transaction.FromEnvelopeXdr(transaction.ToEnvelopeXdr()); Assert.AreEqual(transaction.SourceAccount.AccountId, transaction2.SourceAccount.AccountId); Assert.AreEqual(transaction.SequenceNumber, transaction2.SequenceNumber); Assert.AreEqual(transaction.Memo, transaction2.Memo); Assert.AreEqual(transaction.Fee, transaction2.Fee); Assert.AreEqual( ((CreateAccountOperation)transaction.Operations[0]).StartingBalance, ((CreateAccountOperation)transaction2.Operations[0]).StartingBalance ); }
/// <summary> /// Submit a transaction to the network. /// /// This method will check if any of the destination accounts require a memo. Change the SkipMemoRequiredCheck /// options to change this behaviour. /// </summary> /// <param name="transactionEnvelopeBase64"></param> /// <param name="options"></param> /// <returns></returns> public async Task <SubmitTransactionResponse> SubmitTransaction(string transactionEnvelopeBase64, SubmitTransactionOptions options) { if (!options.SkipMemoRequiredCheck) { var tx = Transaction.FromEnvelopeXdr(transactionEnvelopeBase64); await CheckMemoRequired(tx); } var transactionUri = new UriBuilder(_serverUri).SetPath("/transactions").Uri; var paramsPairs = new List <KeyValuePair <string, string> > { new KeyValuePair <string, string>("tx", transactionEnvelopeBase64) }; var response = await _httpClient.PostAsync(transactionUri, new FormUrlEncodedContent(paramsPairs.ToArray())); if (response.Content != null) { var responseString = await response.Content.ReadAsStringAsync(); var submitTransactionResponse = JsonSingleton.GetInstance <SubmitTransactionResponse>(responseString); return(submitTransactionResponse); } return(null); }
public void TestFromXdrWithMemoId() { // https://github.com/elucidsoft/dotnet-stellar-sdk/issues/208 var tx = Transaction.FromEnvelopeXdr( "AAAAAEdL24Ttos6RnqXCsn8duaV035/QZSC9RXw29IknigHpAAAD6AFb56cAAukDAAAAAQAAAAAAAAAAAAAAAF20fKAAAAACjCiEBz2CpG0AAAABAAAAAAAAAAEAAAAADq+QhtWseqhtnwRIFyZRdLMOVtIqzkujfzUQ22rwZuEAAAAAAAAAAGZeJLcAAAAAAAAAASeKAekAAABAE+X7cGoBhuJ5SDB8WH2B1ZA2RrWIXxGtx+n6wE5d/EggDTpZhRm92b33QqjPUFOfcZ+zbcM+Ny0WR2vcYHEXDA=="); Assert.AreEqual("GBDUXW4E5WRM5EM6UXBLE7Y5XGSXJX472BSSBPKFPQ3PJCJHRIA6SH4C", tx.SourceAccount.AccountId); }
public void TestTransactionWithMuxedAccount() { var originalXdr = "AAAAAgAAAQAAAAAAAAAAAHN2/eiOTNYcwPspSheGs/HQYfXy8cpXRl+qkyIRuUbWAAAAZAAAAAAAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAD0hhcHB5IGJpcnRoZGF5IQAAAAABAAAAAAAAAAEAAAAA4EiRthjlDMvx/ZR8o2GTsMrssrR/MtMFmqHOfei/mxIAAAAAAAAABKgXyAAAAAAAAAAAAA=="; var tx = Transaction.FromEnvelopeXdr(originalXdr); var xdr = tx.ToUnsignedEnvelopeXdrBase64(TransactionBase.TransactionXdrVersion.V1); Assert.AreEqual(originalXdr, xdr); var back = TransactionBuilder.FromEnvelopeXdr(xdr) as Transaction; Assert.IsNotNull(back); Assert.AreEqual(tx.SourceAccount.Address, back.SourceAccount.Address); CollectionAssert.AreEqual(tx.SourceAccount.PublicKey, back.SourceAccount.PublicKey); }
public void TestFromXdr() { var transaction = Transaction.FromEnvelopeXdr("AAAAAF7FIiDToW1fOYUFBC0dmyufJbFTOa2GQESGz+S2h5ViAAAAZAAKVaMAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA7eBSYbzcL5UKo7oXO24y1ckX+XuCtkDsyNHOp1n1bxAAAAAEqBfIAAAAAAAAAAABtoeVYgAAAEDLki9Oi700N60Lo8gUmEFHbKvYG4QSqXiLIt9T0ru2O5BphVl/jR9tYtHAD+UeDYhgXNgwUxqTEu1WukvEyYcD"); var transaction2 = Transaction.FromEnvelopeXdr(transaction.ToEnvelopeXdr()); Assert.AreEqual(transaction.SourceAccount.AccountId, transaction2.SourceAccount.AccountId); Assert.AreEqual(transaction.SequenceNumber, transaction2.SequenceNumber); Assert.AreEqual(transaction.Fee, transaction2.Fee); Assert.AreEqual( ((CreateAccountOperation)transaction.Operations[0]).StartingBalance, ((CreateAccountOperation)transaction2.Operations[0]).StartingBalance ); CollectionAssert.AreEqual(transaction.Signatures, transaction2.Signatures); }
/// <summary> /// Submit a transaction to the network. /// /// This method will check if any of the destination accounts require a memo. Change the SkipMemoRequiredCheck /// options to change this behaviour. /// </summary> /// <param name="transactionEnvelopeBase64"></param> /// <param name="options"></param> /// <returns></returns> public async Task <SubmitTransactionResponse> SubmitTransaction(string transactionEnvelopeBase64, SubmitTransactionOptions options) { if (!options.SkipMemoRequiredCheck) { TransactionBase tx; if (options.FeeBumpTransaction) { tx = FeeBumpTransaction.FromEnvelopeXdr(transactionEnvelopeBase64); } else { tx = Transaction.FromEnvelopeXdr(transactionEnvelopeBase64); } await CheckMemoRequired(tx); } var transactionUri = new UriBuilder(_serverUri).SetPath("/transactions").Uri; var paramsPairs = new List <KeyValuePair <string, string> > { new KeyValuePair <string, string>("tx", transactionEnvelopeBase64) }; var response = await _httpClient.PostAsync(transactionUri, new FormUrlEncodedContent(paramsPairs.ToArray())); if (options.EnsureSuccess && !response.IsSuccessStatusCode) { string responseString = string.Empty; if (response.Content != null) { responseString = await response.Content.ReadAsStringAsync(); } throw new ConnectionErrorException($"Status code ({response.StatusCode}) is not success.{ (!string.IsNullOrEmpty(responseString) ? " Content: " + responseString : "") }"); } if (response.Content != null) { var responseString = await response.Content.ReadAsStringAsync(); var submitTransactionResponse = JsonSingleton.GetInstance <SubmitTransactionResponse>(responseString); return(submitTransactionResponse); } return(null); }
public static TransactionBase FromEnvelopeXdr(TransactionEnvelope envelope) { switch (envelope.Discriminant.InnerValue) { case EnvelopeType.EnvelopeTypeEnum.ENVELOPE_TYPE_TX_V0: return(Transaction.FromEnvelopeXdr(envelope)); case EnvelopeType.EnvelopeTypeEnum.ENVELOPE_TYPE_TX: return(Transaction.FromEnvelopeXdr(envelope)); case EnvelopeType.EnvelopeTypeEnum.ENVELOPE_TYPE_TX_FEE_BUMP: return(FeeBumpTransaction.FromEnvelopeXdr(envelope)); default: throw new ArgumentException($"Unknown envelope type {envelope.Discriminant.InnerValue}"); } }
public void TestFromXdrWithMemo() { var transaction = Transaction.FromEnvelopeXdr( "AAAAACq1Ixcw1fchtF5aLTSw1zaYAYjb3WbBRd4jqYJKThB9AAAAZAA8tDoAAAALAAAAAAAAAAEAAAAZR29sZCBwYXltZW50IGZvciBzZXJ2aWNlcwAAAAAAAAEAAAAAAAAAAQAAAAARREGslec48mbJJygIwZoLvRtL6/gGL4ss2TOpnOUOhgAAAAFHT0xEAAAAACq1Ixcw1fchtF5aLTSw1zaYAYjb3WbBRd4jqYJKThB9AAAAADuaygAAAAAAAAAAAA=="); Assert.AreEqual(1, transaction.Operations.Length); Assert.IsInstanceOfType(transaction.Memo, typeof(MemoText)); var op = transaction.Operations[0]; Assert.IsNull(op.SourceAccount); Assert.IsInstanceOfType(op, typeof(PaymentOperation)); var payment = op as PaymentOperation; Assert.IsNotNull(payment); Assert.AreEqual("100", payment.Amount); var asset = payment.Asset as AssetTypeCreditAlphaNum; Assert.IsNotNull(asset); Assert.AreEqual("GOLD", asset.Code); }
public void TestBuilderTimeBounds() { // GBPMKIRA2OQW2XZZQUCQILI5TMVZ6JNRKM423BSAISDM7ZFWQ6KWEBC4 var source = KeyPair.FromSecretSeed("SCH27VUZZ6UAKB67BDNF6FA42YMBMQCBKXWGMFD5TZ6S5ZZCZFLRXKHS"); var destination = KeyPair.FromAccountId("GDW6AUTBXTOC7FIKUO5BOO3OGLK4SF7ZPOBLMQHMZDI45J2Z6VXRB5NR"); var account = new Account(source, 2908908335136768L); var transaction = new Transaction.Builder(account) .AddOperation(new CreateAccountOperation.Builder(destination, "2000").Build()) .AddTimeBounds(new TimeBounds(42, 1337)) .AddMemo(Memo.Hash("abcdef")) .Build(); transaction.Sign(source); // Convert transaction to binary XDR and back again to make sure timebounds are correctly de/serialized. var bytes = transaction.ToEnvelopeXdrBase64().ToCharArray(); var xdrDataInputStream = new XdrDataInputStream(Convert.FromBase64CharArray(bytes, 0, bytes.Length)); var decodedTransaction = XdrTransaction.Decode(xdrDataInputStream); Assert.AreEqual(decodedTransaction.TimeBounds.MinTime.InnerValue, 42); Assert.AreEqual(decodedTransaction.TimeBounds.MaxTime.InnerValue, 1337); var transaction2 = Transaction.FromEnvelopeXdr(transaction.ToEnvelopeXdr()); Assert.AreEqual(transaction.SourceAccount.AccountId, transaction2.SourceAccount.AccountId); Assert.AreEqual(transaction.SequenceNumber, transaction2.SequenceNumber); Assert.AreEqual(transaction.Memo, transaction2.Memo); Assert.AreEqual(transaction.TimeBounds, transaction2.TimeBounds); Assert.AreEqual(transaction.Fee, transaction2.Fee); Assert.AreEqual( ((CreateAccountOperation)transaction.Operations[0]).StartingBalance, ((CreateAccountOperation)transaction2.Operations[0]).StartingBalance ); }