Skip to content
This repository has been archived by the owner on May 24, 2024. It is now read-only.

Commit

Permalink
feat: add claimable balance endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
fracek committed Sep 29, 2020
1 parent 01e5ee3 commit d414023
Show file tree
Hide file tree
Showing 15 changed files with 371 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System.IO;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using stellar_dotnet_sdk;
using stellar_dotnet_sdk_test.responses;

namespace stellar_dotnet_sdk_test.requests
{
[TestClass]
public class ClaimableBalancesRequestBuilderTest
{
[TestMethod]
public void TestForNativeAsset()
{
var server = new Server("https://horizon-testnet.stellar.org");
var uri = server.ClaimableBalances.ForAsset(new AssetTypeNative()).BuildUri();
Assert.AreEqual("https://horizon-testnet.stellar.org/claimable_balances?asset=native", uri.ToString());
}

[TestMethod]
public void TestForCreditAsset()
{
var asset = Asset.CreateNonNativeAsset("ABC", "GBM2LMVS2EG3GHJ5DKR7CKZ4TP6DQKCHRMDKCZK6WG2NGQVTLF35YE6O");
var server = new Server("https://horizon-testnet.stellar.org");
var uri = server.ClaimableBalances.ForAsset(asset).BuildUri();
Assert.AreEqual(
"https://horizon-testnet.stellar.org/claimable_balances?asset=ABC:GBM2LMVS2EG3GHJ5DKR7CKZ4TP6DQKCHRMDKCZK6WG2NGQVTLF35YE6O",
uri.ToString());
}

[TestMethod]
public void TestForClaimant()
{
var claimant = KeyPair.FromAccountId("GBM2LMVS2EG3GHJ5DKR7CKZ4TP6DQKCHRMDKCZK6WG2NGQVTLF35YE6O");
var server = new Server("https://horizon-testnet.stellar.org");
var uri = server.ClaimableBalances.ForClaimant(claimant).BuildUri();
Assert.AreEqual(
"https://horizon-testnet.stellar.org/claimable_balances?claimant=GBM2LMVS2EG3GHJ5DKR7CKZ4TP6DQKCHRMDKCZK6WG2NGQVTLF35YE6O",
uri.ToString());
}

[TestMethod]
public void TestForSponsor()
{
var sponsor = KeyPair.FromAccountId("GBM2LMVS2EG3GHJ5DKR7CKZ4TP6DQKCHRMDKCZK6WG2NGQVTLF35YE6O");
var server = new Server("https://horizon-testnet.stellar.org");
var uri = server.ClaimableBalances.ForSponsor(sponsor).BuildUri();
Assert.AreEqual(
"https://horizon-testnet.stellar.org/claimable_balances?sponsor=GBM2LMVS2EG3GHJ5DKR7CKZ4TP6DQKCHRMDKCZK6WG2NGQVTLF35YE6O",
uri.ToString());
}

[TestMethod]
public async Task TestClaimableBalance()
{
var jsonResponse = File.ReadAllText(Path.Combine("testdata", "claimableBalance.json"));
var fakeHttpClient = FakeHttpClient.CreateFakeHttpClient(jsonResponse);

using (var server = new Server("https://horizon-testnet.stellar.org", fakeHttpClient))
{
var claimableBalance =
await server.ClaimableBalances.ClaimableBalance(
"00000000c582697b67cbec7f9ce64f4dc67bfb2bfd26318bb9f964f4d70e3f41f650b1e6");
ClaimableBalanceDeserializerTest.AssertTestData(claimableBalance);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
using stellar_dotnet_sdk.responses;

namespace stellar_dotnet_sdk_test.responses
{
[TestClass]
public class ClaimableBalanceDeserializerTest
{
[TestMethod]
public void TestDeserialize()
{
var json = File.ReadAllText(Path.Combine("testdata", "claimableBalance.json"));
var claimableBalance = JsonSingleton.GetInstance<ClaimableBalanceResponse>(json);
AssertTestData(claimableBalance);
}

[TestMethod]
public void TestSerializeDeserialize()
{
var json = File.ReadAllText(Path.Combine("testdata", "claimableBalance.json"));
var claimableBalance = JsonConvert.DeserializeObject<ClaimableBalanceResponse>(json);

var serialized = JsonConvert.SerializeObject(claimableBalance);
var back = JsonConvert.DeserializeObject<ClaimableBalanceResponse>(serialized);

Assert.AreEqual(claimableBalance.LastModifiedLedger, back.LastModifiedLedger);
Assert.AreEqual(claimableBalance.Asset, back.Asset);
Assert.AreEqual(claimableBalance.Sponsor, back.Sponsor);
}

public static void AssertTestData(ClaimableBalanceResponse claimableBalance)
{
Assert.AreEqual("00000000c582697b67cbec7f9ce64f4dc67bfb2bfd26318bb9f964f4d70e3f41f650b1e6", claimableBalance.Id);
Assert.AreEqual("native", claimableBalance.Asset);
Assert.AreEqual("GB5N4275ETC6A77K4DTDL3EFAQMN66PC7UITDUZUBM7Y6LDJP7EYSGOB", claimableBalance.Sponsor);
Assert.AreEqual(66835, claimableBalance.LastModifiedLedger);
Assert.AreEqual("66835-00000000c582697b67cbec7f9ce64f4dc67bfb2bfd26318bb9f964f4d70e3f41f650b1e6", claimableBalance.PagingToken);

Assert.AreEqual(1, claimableBalance.Claimants.Length);
var claimant = claimableBalance.Claimants[0];
Assert.AreEqual("GD2I2F7SWUHBAD7XBIZTF7MBMWQYWJVEFMWTXK76NSYVOY52OJRYNTIY", claimant.Destination);
Assert.AreEqual(true, claimant.Predicate.Unconditional);
}
}
}
3 changes: 1 addition & 2 deletions stellar-dotnet-sdk-test/responses/EffectDeserializerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -998,8 +998,7 @@ private static void AssertClaimableBalanceClaimantCreatedEffect(EffectResponse i
Assert.AreEqual("native", effect.Asset);
Assert.AreEqual("00000000be7e37b24927c095e2292d5d0e6db8b0f2dbeb1355847c7fccb458cbdd61bfd0", effect.BalanceID);
Assert.AreEqual("1.0000000", effect.Amount);
Assert.AreEqual(effect.Predicate, ClaimPredicate.Not(ClaimPredicate.BeforeRelativeTime(604800)));

Assert.IsNotNull(effect.Predicate.ToClaimPredicate());
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,7 @@ private static void AssertRevokeSponsorshipOfferData(OperationResponse instance)
var operation = (RevokeSponsorshipOperationResponse)instance;

Assert.AreEqual(286800736161794, operation.Id);
Assert.AreEqual("", operation.OfferID);
Assert.IsNull(operation.OfferID);
}

//Revoke Sponsorship Signer Key
Expand Down
115 changes: 59 additions & 56 deletions stellar-dotnet-sdk-test/stellar-dotnet-sdk-test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -44,59 +44,59 @@
<None Update="testdata\assetPage.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\dataSponsorship\dataSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\dataSponsorship\dataSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\dataSponsorship\dataSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\dataSponsorship\dataSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\dataSponsorship\dataSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\dataSponsorship\dataSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\trustlineSponsorship\trustlineSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\trustlineSponsorship\trustlineSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\trustlineSponsorship\trustlineSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\trustlineSponsorship\trustlineSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\trustlineSponsorship\trustlineSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\trustlineSponsorship\trustlineSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\signerSponsorship\signerSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\signerSponsorship\signerSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\signerSponsorship\signerSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\signerSponsorship\signerSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\signerSponsorship\signerSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\signerSponsorship\signerSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\claimableBalance\claimableBalanceSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\claimableBalance\claimableBalanceSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\claimableBalance\claimableBalanceSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\claimableBalance\claimableBalanceSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\claimableBalance\claimableBalanceSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\claimableBalance\claimableBalanceSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\claimableBalance\claimableBalanceCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\claimableBalance\claimableBalanceCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\claimableBalance\claimableBalanceClaimed.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\claimableBalance\claimableBalanceClaimed.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\claimableBalance\claimableBalanceClaimantCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\claimableBalance\claimableBalanceClaimantCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\accountSponsorship\accountSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\accountSponsorship\accountSponsorshipRemoved.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\accountSponsorship\accountSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\accountSponsorship\accountSponsorshipUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\accountSponsorship\accountSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\effects\accountSponsorship\accountSponsorshipCreated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\effects\effectAccountInflationUpdated.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand Down Expand Up @@ -200,35 +200,35 @@
<None Update="testdata\offerPage.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationRevokeSponsorshipSignerKey.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationRevokeSponsorshipSignerKey.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationRevokeSponsorshipTrustline.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationRevokeSponsorshipTrustline.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationRevokeSponsorshipOffer.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationRevokeSponsorshipOffer.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationRevokeSponsorshipData.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationRevokeSponsorshipData.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationRevokeSponsorshipClaimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationRevokeSponsorshipClaimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationRevokeSponsorshipAccountID.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationRevokeSponsorshipAccountID.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationEndSponsoringFutureReserves.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationEndSponsoringFutureReserves.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationClaimClaimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationClaimClaimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationBeginSponsoringFutureReserves.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationBeginSponsoringFutureReserves.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationCreateClaimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<None Update="testdata\operations\operationCreateClaimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\operations\operationAccountMerge.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand Down Expand Up @@ -356,5 +356,8 @@
<None Update="testdata\accountsWithTrustline.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="testdata\claimableBalance.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
21 changes: 21 additions & 0 deletions stellar-dotnet-sdk-test/testdata/claimableBalance.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"_links": {
"self": {
"href": "https://horizon-protocol14.stellar.org/claimable_balances/00000000c582697b67cbec7f9ce64f4dc67bfb2bfd26318bb9f964f4d70e3f41f650b1e6"
}
},
"id": "00000000c582697b67cbec7f9ce64f4dc67bfb2bfd26318bb9f964f4d70e3f41f650b1e6",
"asset": "native",
"amount": "13.1200000",
"sponsor": "GB5N4275ETC6A77K4DTDL3EFAQMN66PC7UITDUZUBM7Y6LDJP7EYSGOB",
"last_modified_ledger": 66835,
"claimants": [
{
"destination": "GD2I2F7SWUHBAD7XBIZTF7MBMWQYWJVEFMWTXK76NSYVOY52OJRYNTIY",
"predicate": {
"unconditional": true
}
}
],
"paging_token": "66835-00000000c582697b67cbec7f9ce64f4dc67bfb2bfd26318bb9f964f4d70e3f41f650b1e6"
}
5 changes: 5 additions & 0 deletions stellar-dotnet-sdk/Asset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,10 @@ public static Asset CreateNonNativeAsset(string assetType, string accountId, str

return CreateNonNativeAsset(code, accountId);
}

/// <summary>
/// Returns the asset canonical name.
/// </summary>
public abstract string CanonicalName();
}
}
6 changes: 6 additions & 0 deletions stellar-dotnet-sdk/AssetTypeCreditAlphaNum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,11 @@ public override xdr.Asset ToXdr()
{
throw new NotSupportedException();
}

/// <inheritdoc />
public override string CanonicalName()
{
return $"{Code}:{Issuer}";
}
}
}
6 changes: 6 additions & 0 deletions stellar-dotnet-sdk/AssetTypeNative.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,11 @@ public override xdr.Asset ToXdr()
thisXdr.Discriminant = AssetType.Create(AssetType.AssetTypeEnum.ASSET_TYPE_NATIVE);
return thisXdr;
}

/// <inheritdoc />
public override string CanonicalName()
{
return "native";
}
}
}
1 change: 1 addition & 0 deletions stellar-dotnet-sdk/Server.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public RootResponse Root()

public AssetsRequestBuilder Assets => new AssetsRequestBuilder(_serverUri, _httpClient);

public ClaimableBalancesRequestBuilder ClaimableBalances => new ClaimableBalancesRequestBuilder(_serverUri, _httpClient);
public EffectsRequestBuilder Effects => new EffectsRequestBuilder(_serverUri, _httpClient);

public LedgersRequestBuilder Ledgers => new LedgersRequestBuilder(_serverUri, _httpClient);
Expand Down

0 comments on commit d414023

Please sign in to comment.