From 1fa24329433d1c295178579d7816e1ae47f23e8e Mon Sep 17 00:00:00 2001 From: Kirbyrawr Date: Sun, 26 Apr 2020 17:11:24 +0200 Subject: [PATCH] Added AuthorizeToMaintainLiabilities and tests. --- stellar-dotnet-sdk-test/OperationTest.cs | 106 ++++++++++++++++------ stellar-dotnet-sdk/AllowTrustOperation.cs | 49 ++++++++-- 2 files changed, 119 insertions(+), 36 deletions(-) diff --git a/stellar-dotnet-sdk-test/OperationTest.cs b/stellar-dotnet-sdk-test/OperationTest.cs index cf8964b18..596df336a 100644 --- a/stellar-dotnet-sdk-test/OperationTest.cs +++ b/stellar-dotnet-sdk-test/OperationTest.cs @@ -24,7 +24,7 @@ public void TestCreateAccountOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (CreateAccountOperation) Operation.FromXdr(xdr); + var parsedOperation = (CreateAccountOperation)Operation.FromXdr(xdr); Assert.AreEqual(10000000000L, xdr.Body.CreateAccountOp.StartingBalance.InnerValue); Assert.AreEqual(source.AccountId, parsedOperation.SourceAccount.AccountId); @@ -53,7 +53,7 @@ public void TestPaymentOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (PaymentOperation) Operation.FromXdr(xdr); + var parsedOperation = (PaymentOperation)Operation.FromXdr(xdr); Assert.AreEqual(10000000000L, xdr.Body.PaymentOp.Amount.InnerValue); Assert.AreEqual(source.AccountId, parsedOperation.SourceAccount.AccountId); @@ -86,7 +86,7 @@ public void TestPathPaymentStrictReceiveOperation() var sendMax = "0.0001"; Asset destAsset = new AssetTypeCreditAlphaNum4("USD", issuer.AccountId); var destAmount = "0.0001"; - Asset[] path = {new AssetTypeCreditAlphaNum4("USD", pathIssuer1.AccountId), new AssetTypeCreditAlphaNum12("TESTTEST", pathIssuer2.AccountId)}; + Asset[] path = { new AssetTypeCreditAlphaNum4("USD", pathIssuer1.AccountId), new AssetTypeCreditAlphaNum12("TESTTEST", pathIssuer2.AccountId) }; var operation = new PathPaymentStrictReceiveOperation.Builder( sendAsset, sendMax, destination, destAsset, destAmount) @@ -95,7 +95,7 @@ public void TestPathPaymentStrictReceiveOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (PathPaymentStrictReceiveOperation) Operation.FromXdr(xdr); + var parsedOperation = (PathPaymentStrictReceiveOperation)Operation.FromXdr(xdr); Assert.AreEqual(1000L, xdr.Body.PathPaymentStrictReceiveOp.SendMax.InnerValue); Assert.AreEqual(1000L, xdr.Body.PathPaymentStrictReceiveOp.DestAmount.InnerValue); @@ -139,7 +139,7 @@ public void TestPathPaymentStrictReceiveEmptyPathOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (PathPaymentStrictReceiveOperation) Operation.FromXdr(xdr); + var parsedOperation = (PathPaymentStrictReceiveOperation)Operation.FromXdr(xdr); Assert.AreEqual(1000L, xdr.Body.PathPaymentStrictReceiveOp.SendMax.InnerValue); Assert.AreEqual(1000L, xdr.Body.PathPaymentStrictReceiveOp.DestAmount.InnerValue); @@ -176,7 +176,7 @@ public void TestPathPaymentStrictSendOperation() var sendAmount = "0.0001"; Asset destAsset = new AssetTypeCreditAlphaNum4("USD", issuer.AccountId); var destMin = "0.0001"; - Asset[] path = {new AssetTypeCreditAlphaNum4("USD", pathIssuer1.AccountId), new AssetTypeCreditAlphaNum12("TESTTEST", pathIssuer2.AccountId)}; + Asset[] path = { new AssetTypeCreditAlphaNum4("USD", pathIssuer1.AccountId), new AssetTypeCreditAlphaNum12("TESTTEST", pathIssuer2.AccountId) }; var operation = new PathPaymentStrictSendOperation.Builder( sendAsset, sendAmount, destination, destAsset, destMin) @@ -185,7 +185,7 @@ public void TestPathPaymentStrictSendOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (PathPaymentStrictSendOperation) Operation.FromXdr(xdr); + var parsedOperation = (PathPaymentStrictSendOperation)Operation.FromXdr(xdr); Assert.IsTrue(parsedOperation.SendAsset is AssetTypeNative); Assert.AreEqual(source.AccountId, parsedOperation.SourceAccount.AccountId); @@ -227,7 +227,7 @@ public void TestPathPaymentStrictSendEmptyPathOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (PathPaymentStrictSendOperation) Operation.FromXdr(xdr); + var parsedOperation = (PathPaymentStrictSendOperation)Operation.FromXdr(xdr); Assert.IsTrue(parsedOperation.SendAsset is AssetTypeNative); Assert.AreEqual(source.AccountId, parsedOperation.SourceAccount.AccountId); @@ -257,7 +257,7 @@ public void TestChangeTrustOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (ChangeTrustOperation) Operation.FromXdr(xdr); + var parsedOperation = (ChangeTrustOperation)Operation.FromXdr(xdr); Assert.AreEqual(9223372036854775807L, xdr.Body.ChangeTrustOp.Limit.InnerValue); Assert.AreEqual(source.AccountId, parsedOperation.SourceAccount.AccountId); @@ -279,24 +279,76 @@ public void TestAllowTrustOperation() var trustor = KeyPair.FromSecretSeed("SDHZGHURAYXKU2KMVHPOXI6JG2Q4BSQUQCEOY72O3QQTCLR2T455PMII"); const string assetCode = "USDA"; - const bool authorize = true; - var operation = new AllowTrustOperation.Builder(trustor, assetCode, true) + var operation = new AllowTrustOperation.Builder(trustor, assetCode, true, true) .SetSourceAccount(source) .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (AllowTrustOperation) Operation.FromXdr(xdr); + var parsedOperation = (AllowTrustOperation)Operation.FromXdr(xdr); Assert.AreEqual(source.AccountId, parsedOperation.SourceAccount.AccountId); Assert.AreEqual(trustor.AccountId, parsedOperation.Trustor.AccountId); Assert.AreEqual(assetCode, parsedOperation.AssetCode); - Assert.AreEqual(authorize, parsedOperation.Authorize); + Assert.AreEqual(OperationThreshold.Low, parsedOperation.Threshold); Assert.AreEqual( "AAAAAQAAAAC7JAuE3XvquOnbsgv2SRztjuk4RoBVefQ0rlrFMMQvfAAAAAcAAAAA7eBSYbzcL5UKo7oXO24y1ckX+XuCtkDsyNHOp1n1bxAAAAABVVNEQQAAAAE=", operation.ToXdrBase64()); + + TestAllowTrustOperationAuthorize(source, trustor, assetCode); + } + + private static void TestAllowTrustOperationAuthorize(KeyPair source, KeyPair trustor, string assetCode) + { + AllowTrustOperation operation = null; + stellar_dotnet_sdk.xdr.Operation xdr = null; + AllowTrustOperation parsedOperation = null; + + //Authorize: true, MaintainLiabilities: false -> true, false + operation = new AllowTrustOperation.Builder(trustor, assetCode, true, false) + .SetSourceAccount(source) + .Build(); + + xdr = operation.ToXdr(); + parsedOperation = (AllowTrustOperation)Operation.FromXdr(xdr); + + Assert.AreEqual(true, parsedOperation.Authorize); + Assert.AreEqual(false, parsedOperation.AuthorizeToMaintainLiabilities); + + //Authorize: false, MaintainLiabilities: true -> false, true + operation = new AllowTrustOperation.Builder(trustor, assetCode, false, true) + .SetSourceAccount(source) + .Build(); + + xdr = operation.ToXdr(); + parsedOperation = (AllowTrustOperation)Operation.FromXdr(xdr); + + Assert.AreEqual(false, parsedOperation.Authorize); + Assert.AreEqual(true, parsedOperation.AuthorizeToMaintainLiabilities); + + //Authorize: true, MaintainLiabilities: true -> true, false + operation = new AllowTrustOperation.Builder(trustor, assetCode, true, true) + .SetSourceAccount(source) + .Build(); + + xdr = operation.ToXdr(); + parsedOperation = (AllowTrustOperation)Operation.FromXdr(xdr); + + Assert.AreEqual(true, parsedOperation.Authorize); + Assert.AreEqual(false, parsedOperation.AuthorizeToMaintainLiabilities); + + //Authorize: false, MaintainLiabilities: false -> false, false + operation = new AllowTrustOperation.Builder(trustor, assetCode, false, false) + .SetSourceAccount(source) + .Build(); + + xdr = operation.ToXdr(); + parsedOperation = (AllowTrustOperation)Operation.FromXdr(xdr); + + Assert.AreEqual(false, parsedOperation.Authorize); + Assert.AreEqual(false, parsedOperation.AuthorizeToMaintainLiabilities); } [TestMethod] @@ -332,7 +384,7 @@ public void TestSetOptionsOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (SetOptionsOperation) Operation.FromXdr(xdr); + var parsedOperation = (SetOptionsOperation)Operation.FromXdr(xdr); Assert.AreEqual(inflationDestination.AccountId, parsedOperation.InflationDestination.AccountId); Assert.AreEqual(1U, parsedOperation.ClearFlags); @@ -367,7 +419,7 @@ public void TestSetOptionsOperationSingleField() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (SetOptionsOperation) Operation.FromXdr(xdr); + var parsedOperation = (SetOptionsOperation)Operation.FromXdr(xdr); Assert.AreEqual(null, parsedOperation.InflationDestination); Assert.AreEqual(null, parsedOperation.ClearFlags); @@ -401,7 +453,7 @@ public void TestSetOptionsOperationSignerSha256() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (SetOptionsOperation) Operation.FromXdr(xdr); + var parsedOperation = (SetOptionsOperation)Operation.FromXdr(xdr); Assert.AreEqual(null, parsedOperation.InflationDestination); Assert.AreEqual(null, parsedOperation.ClearFlags); @@ -444,7 +496,7 @@ public void TestSetOptionsOperationPreAuthTxSigner() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (SetOptionsOperation) Operation.FromXdr(xdr); + var parsedOperation = (SetOptionsOperation)Operation.FromXdr(xdr); Assert.AreEqual(null, parsedOperation.InflationDestination); Assert.AreEqual(null, parsedOperation.ClearFlags); @@ -509,7 +561,7 @@ public void TestManageSellOfferOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (ManageSellOfferOperation) Operation.FromXdr(xdr); + var parsedOperation = (ManageSellOfferOperation)Operation.FromXdr(xdr); Assert.AreEqual(100L, xdr.Body.ManageSellOfferOp.Amount.InnerValue); Assert.IsTrue(parsedOperation.Selling is AssetTypeNative); @@ -548,7 +600,7 @@ public void TestManageBuyOfferOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (ManageBuyOfferOperation) Operation.FromXdr(xdr); + var parsedOperation = (ManageBuyOfferOperation)Operation.FromXdr(xdr); Assert.AreEqual(100L, xdr.Body.ManageBuyOfferOp.BuyAmount.InnerValue); Assert.IsTrue(parsedOperation.Selling is AssetTypeNative); @@ -608,7 +660,7 @@ public void TestCreatePassiveSellOfferOperation() .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (CreatePassiveSellOfferOperation) Operation.FromXdr(xdr); + var parsedOperation = (CreatePassiveSellOfferOperation)Operation.FromXdr(xdr); Assert.AreEqual(100L, xdr.Body.CreatePassiveSellOfferOp.Amount.InnerValue); Assert.IsTrue(parsedOperation.Selling is AssetTypeNative); @@ -639,7 +691,7 @@ public void TestAccountMergeOperation() var xdr = operation.ToXdr(); - var parsedOperation = (AccountMergeOperation) Operation.FromXdr(xdr); + var parsedOperation = (AccountMergeOperation)Operation.FromXdr(xdr); Assert.AreEqual(destination.AccountId, parsedOperation.Destination.AccountId); Assert.AreEqual(OperationThreshold.High, parsedOperation.Threshold); @@ -655,16 +707,16 @@ public void TestManageDataOperation() // GC5SIC4E3V56VOHJ3OZAX5SJDTWY52JYI2AFK6PUGSXFVRJQYQXXZBZF var source = KeyPair.FromSecretSeed("SC4CGETADVYTCR5HEAVZRB3DZQY5Y4J7RFNJTRA6ESMHIPEZUSTE2QDK"); - var operation = new ManageDataOperation.Builder("test", new byte[] {0, 1, 2, 3, 4}) + var operation = new ManageDataOperation.Builder("test", new byte[] { 0, 1, 2, 3, 4 }) .SetSourceAccount(source) .Build(); var xdr = operation.ToXdr(); - var parsedOperation = (ManageDataOperation) Operation.FromXdr(xdr); + var parsedOperation = (ManageDataOperation)Operation.FromXdr(xdr); Assert.AreEqual("test", parsedOperation.Name); - Assert.IsTrue(new byte[] {0, 1, 2, 3, 4}.SequenceEqual(parsedOperation.Value)); + Assert.IsTrue(new byte[] { 0, 1, 2, 3, 4 }.SequenceEqual(parsedOperation.Value)); Assert.AreEqual(OperationThreshold.Medium, parsedOperation.Threshold); Assert.AreEqual( @@ -684,7 +736,7 @@ public void TestManageDataOperationEmptyValue() var xdr = operation.ToXdr(); - var parsedOperation = (ManageDataOperation) Operation.FromXdr(xdr); + var parsedOperation = (ManageDataOperation)Operation.FromXdr(xdr); Assert.AreEqual("test", parsedOperation.Name); Assert.AreEqual(null, parsedOperation.Value); @@ -744,7 +796,7 @@ public void TestBumpSequence() var xdr = operation.ToXdr(); - var parsedOperation = (BumpSequenceOperation) Operation.FromXdr(xdr); + var parsedOperation = (BumpSequenceOperation)Operation.FromXdr(xdr); Assert.AreEqual(156L, parsedOperation.BumpTo); Assert.AreEqual(OperationThreshold.Low, parsedOperation.Threshold); @@ -764,7 +816,7 @@ public void TestInflationOperation() var xdr = operation.ToXdr(); - var parsedOperation = (InflationOperation) Operation.FromXdr(xdr); + var parsedOperation = (InflationOperation)Operation.FromXdr(xdr); Assert.AreEqual(operation.SourceAccount.AccountId, parsedOperation.SourceAccount.AccountId); Assert.AreEqual("AAAAAQAAAAC7JAuE3XvquOnbsgv2SRztjuk4RoBVefQ0rlrFMMQvfAAAAAk=", operation.ToXdrBase64()); diff --git a/stellar-dotnet-sdk/AllowTrustOperation.cs b/stellar-dotnet-sdk/AllowTrustOperation.cs index 504b3cb89..eb4a5803e 100644 --- a/stellar-dotnet-sdk/AllowTrustOperation.cs +++ b/stellar-dotnet-sdk/AllowTrustOperation.cs @@ -1,6 +1,6 @@ -using System; +using stellar_dotnet_sdk.xdr; +using System; using System.Text; -using stellar_dotnet_sdk.xdr; using sdkxdr = stellar_dotnet_sdk.xdr; namespace stellar_dotnet_sdk @@ -13,11 +13,12 @@ namespace stellar_dotnet_sdk /// public class AllowTrustOperation : Operation { - private AllowTrustOperation(KeyPair trustor, string assetCode, bool authorize) + private AllowTrustOperation(KeyPair trustor, string assetCode, bool authorize, bool authorizeToMaintainLiabilities) { Trustor = trustor ?? throw new ArgumentNullException(nameof(trustor), "trustor cannot be null"); AssetCode = assetCode ?? throw new ArgumentNullException(nameof(assetCode), "assetCode cannot be null"); Authorize = authorize; + AuthorizeToMaintainLiabilities = authorizeToMaintainLiabilities; } /// @@ -35,6 +36,8 @@ private AllowTrustOperation(KeyPair trustor, string assetCode, bool authorize) /// public bool Authorize { get; } + public bool AuthorizeToMaintainLiabilities { get; } + public override OperationThreshold Threshold { get => OperationThreshold.Low; @@ -52,6 +55,7 @@ public override sdkxdr.Operation.OperationBody ToOperationBody() var trustor = new sdkxdr.AccountID(); trustor.InnerValue = Trustor.XdrPublicKey; op.Trustor = trustor; + // asset var asset = new sdkxdr.AllowTrustOp.AllowTrustOpAsset(); if (AssetCode.Length <= 4) @@ -66,16 +70,24 @@ public override sdkxdr.Operation.OperationBody ToOperationBody() } op.Asset = asset; + // authorize + var trustlineFlag = new Uint32(); + if (Authorize) { - op.Authorize = new Uint32(1); + trustlineFlag.InnerValue = (uint)TrustLineFlags.TrustLineFlagsEnum.AUTHORIZED_FLAG; + } + else if (AuthorizeToMaintainLiabilities) + { + trustlineFlag.InnerValue = (uint)TrustLineFlags.TrustLineFlagsEnum.AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG; } else { - op.Authorize = new Uint32(0); + trustlineFlag.InnerValue = 0; } + op.Authorize = trustlineFlag; var body = new sdkxdr.Operation.OperationBody(); body.Discriminant = sdkxdr.OperationType.Create(sdkxdr.OperationType.OperationTypeEnum.ALLOW_TRUST); @@ -89,9 +101,10 @@ public override sdkxdr.Operation.OperationBody ToOperationBody() /// public class Builder { + private readonly KeyPair _trustor; private readonly string _assetCode; private readonly bool _authorize; - private readonly KeyPair _trustor; + private readonly bool _authorizeToMaintainLiabilities; private KeyPair _sourceAccount; @@ -117,7 +130,23 @@ public Builder(sdkxdr.AllowTrustOp op) throw new Exception("Unknown asset code"); } - _authorize = op.Authorize.InnerValue != 0; + uint trustlineFlag = op.Authorize.InnerValue; + + if (trustlineFlag == (uint)TrustLineFlags.TrustLineFlagsEnum.AUTHORIZED_FLAG) + { + _authorize = true; + _authorizeToMaintainLiabilities = false; + } + else if (trustlineFlag == (uint)TrustLineFlags.TrustLineFlagsEnum.AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG) + { + _authorize = false; + _authorizeToMaintainLiabilities = true; + } + else + { + _authorize = false; + _authorizeToMaintainLiabilities = false; + } } /// @@ -129,11 +158,13 @@ public Builder(sdkxdr.AllowTrustOp op) /// to allow another account to hold its USD credit, the type is USD. /// /// Flag indicating whether the trustline is authorized. - public Builder(KeyPair trustor, string assetCode, bool authorize) + /// Flag indicating whether the trustline is authorized to maintain liabilities + public Builder(KeyPair trustor, string assetCode, bool authorize, bool authorizeToMaintainLiabilities) { _trustor = trustor; _assetCode = assetCode; _authorize = authorize; + _authorizeToMaintainLiabilities = authorizeToMaintainLiabilities; } /// @@ -152,7 +183,7 @@ public Builder SetSourceAccount(KeyPair sourceAccount) /// public AllowTrustOperation Build() { - var operation = new AllowTrustOperation(_trustor, _assetCode, _authorize); + var operation = new AllowTrustOperation(_trustor, _assetCode, _authorize, _authorizeToMaintainLiabilities); if (_sourceAccount != null) operation.SourceAccount = _sourceAccount; return operation;