Skip to content

Commit 4b24a66

Browse files
authored
Buy With Fiat API // Scene_Pay (#178)
1 parent 69ca41f commit 4b24a66

32 files changed

+2523
-175
lines changed

Assets/Thirdweb/Core/Scripts/Pay/Constants.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@ public static class Constants
44
{
55
public const string THIRDWEB_PAY_BASE_URL = "https://pay.thirdweb.com";
66

7-
public const string THIRDWEB_PAY_QUOTE_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-crypto/quote/v1";
8-
public const string THIRDWEB_PAY_STATUS_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-crypto/status/v1";
9-
public const string THIRDWEB_PAY_HISTORY_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-crypto/history/v1";
7+
public const string THIRDWEB_PAY_CRYPTO_QUOTE_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-crypto/quote/v1";
8+
public const string THIRDWEB_PAY_CRYPTO_STATUS_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-crypto/status/v1";
9+
10+
public const string THIRDWEB_PAY_FIAT_QUOTE_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-fiat/quote/v1";
11+
public const string THIRDWEB_PAY_FIAT_STATUS_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-fiat/status/v1";
12+
13+
public const string THIRDWEB_PAY_FIAT_CURRENCIES_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/buy-with-fiat/currency/v1";
14+
15+
public const string THIRDWEB_PAY_HISTORY_ENDPOINT = THIRDWEB_PAY_BASE_URL + "/wallet/history/v1";
1016
}
1117
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using UnityEngine;
4+
5+
namespace Thirdweb.Pay
6+
{
7+
public static partial class ThirdwebPay
8+
{
9+
/// <summary>
10+
/// Buy crypto with fiat using the onramp link from the quote and get a quote ID to poll for the onramp status.
11+
/// </summary>
12+
/// <param name="buyWithFiatQuote">Quote containing onramp details</param>
13+
/// <param name="sdk">Optional SDK instance, defaults to ThirdwebManager instance</param>
14+
/// <returns>Quote ID to poll for the onramp status</returns>
15+
public static string BuyWithFiat(BuyWithFiatQuoteResult buyWithFiatQuote, ThirdwebSDK sdk = null)
16+
{
17+
sdk ??= ThirdwebManager.Instance.SDK;
18+
19+
if (string.IsNullOrEmpty(buyWithFiatQuote.OnRampLink))
20+
{
21+
throw new Exception("OnRampLink is required to buy with fiat.");
22+
}
23+
24+
var onRampLink = buyWithFiatQuote.OnRampLink;
25+
26+
Application.OpenURL(onRampLink);
27+
28+
return buyWithFiatQuote.IntentId;
29+
}
30+
}
31+
}

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.BuyWithFiat.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyWithCryptoHistory.cs renamed to Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyHistory.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ namespace Thirdweb.Pay
1010
public static partial class ThirdwebPay
1111
{
1212
/// <summary>
13-
/// Get swap history, supports cursor and pagination.
13+
/// Get buy history, supports cursor and pagination.
1414
/// </summary>
15-
/// <param name="walletAddress">User wallet address to get swap history for</param>
15+
/// <param name="walletAddress">User wallet address to get buy history for</param>
1616
/// <param name="start">Offset for the records</param>
1717
/// <param name="count">Number of records to retrieve</param>
1818
/// <param name="cursor">Cursor for paging through the history</param>
19-
/// <param name="pageSize">Swap statuses to query for</param>
20-
/// <returns>Swap history object <see cref="BuyWithCryptoHistoryResult"/></returns>
19+
/// <param name="pageSize">Buy statuses to query for</param>
20+
/// <returns>Buy history object <see cref="BuyHistoryResult"/></returns>
2121
/// <exception cref="Exception"></exception>
22-
public static async Task<BuyWithCryptoHistoryResult> GetBuyWithCryptoHistory(string walletAddress, int start, int count, string cursor = null, int? pageSize = null)
22+
public static async Task<BuyHistoryResult> GetBuyHistory(string walletAddress, int start, int count, string cursor = null, int? pageSize = null)
2323
{
2424
if (string.IsNullOrEmpty(Utils.GetClientId()))
2525
{
@@ -83,7 +83,8 @@ public static async Task<BuyWithCryptoHistoryResult> GetBuyWithCryptoHistory(str
8383
}
8484

8585
var content = request.downloadHandler.text;
86-
var data = JsonConvert.DeserializeObject<SwapHistoryResponse>(content);
86+
ThirdwebDebug.Log($"GetBuyHistory response: {content}");
87+
var data = JsonConvert.DeserializeObject<BuyHistoryResponse>(content);
8788
return data.Result;
8889
}
8990
}

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyWithCryptoQuote.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@ public static async Task<BuyWithCryptoQuoteResult> GetBuyWithCryptoQuote(BuyWith
3434
{ "toTokenAddress", buyWithCryptoParams.ToTokenAddress },
3535
{ "toAmount", buyWithCryptoParams.ToAmount },
3636
{ "toAmountWei", buyWithCryptoParams.ToAmountWei },
37-
{ "maxSlippageBPS", buyWithCryptoParams.MaxSlippageBPS?.ToString() }
37+
{ "maxSlippageBPS", buyWithCryptoParams.MaxSlippageBPS?.ToString() },
38+
{ "intentId", buyWithCryptoParams.IntentId }
3839
};
3940

4041
var queryStringFormatted = string.Join("&", queryString.Where(kv => kv.Value != null).Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
41-
var url = $"{Constants.THIRDWEB_PAY_QUOTE_ENDPOINT}?{queryStringFormatted}";
42+
var url = $"{Constants.THIRDWEB_PAY_CRYPTO_QUOTE_ENDPOINT}?{queryStringFormatted}";
4243

4344
using var request = UnityWebRequest.Get(url);
4445

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyWithCryptoStatus.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static async Task<BuyWithCryptoStatusResult> GetBuyWithCryptoStatus(strin
3030
var queryString = new Dictionary<string, string> { { "transactionHash", transactionHash } };
3131

3232
var queryStringFormatted = string.Join("&", queryString.Where(kv => kv.Value != null).Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
33-
var url = $"{Constants.THIRDWEB_PAY_STATUS_ENDPOINT}?{queryStringFormatted}";
33+
var url = $"{Constants.THIRDWEB_PAY_CRYPTO_STATUS_ENDPOINT}?{queryStringFormatted}";
3434

3535
using var request = UnityWebRequest.Get(url);
3636

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using UnityEngine.Networking;
4+
using Newtonsoft.Json;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
using Thirdweb.Redcode.Awaiting;
8+
9+
namespace Thirdweb.Pay
10+
{
11+
public static partial class ThirdwebPay
12+
{
13+
/// <summary>
14+
/// Get supported fiat currencies for Buy with Fiat.
15+
/// </summary>
16+
/// <returns>List of supported Fiat currency symbols.</returns>
17+
public static async Task<List<string>> GetBuyWithFiatCurrencies()
18+
{
19+
if (string.IsNullOrEmpty(Utils.GetClientId()))
20+
{
21+
throw new Exception("Client ID is not set. Please set it in the ThirdwebManager.");
22+
}
23+
24+
var url = $"{Constants.THIRDWEB_PAY_FIAT_CURRENCIES_ENDPOINT}";
25+
26+
using var request = UnityWebRequest.Get(url);
27+
28+
request.SetRequestHeader("x-sdk-name", "UnitySDK");
29+
request.SetRequestHeader("x-sdk-os", Utils.GetRuntimePlatform());
30+
request.SetRequestHeader("x-sdk-platform", "unity");
31+
request.SetRequestHeader("x-sdk-version", ThirdwebSDK.version);
32+
request.SetRequestHeader("x-client-id", ThirdwebManager.Instance.SDK.Session.Options.clientId);
33+
if (!Utils.IsWebGLBuild())
34+
request.SetRequestHeader("x-bundle-id", ThirdwebManager.Instance.SDK.Session.Options.bundleId);
35+
36+
await request.SendWebRequest();
37+
38+
if (request.result != UnityWebRequest.Result.Success)
39+
{
40+
ErrorResponse error;
41+
try
42+
{
43+
error = JsonConvert.DeserializeObject<ErrorResponse>(request.downloadHandler.text);
44+
}
45+
catch
46+
{
47+
error = new ErrorResponse
48+
{
49+
Error = new ErrorDetails
50+
{
51+
Message = "Unknown error",
52+
Reason = "Unknown",
53+
Code = "Unknown",
54+
Stack = "Unknown",
55+
StatusCode = (int)request.responseCode
56+
}
57+
};
58+
}
59+
60+
throw new Exception(
61+
$"HTTP error! Code: {error.Error.Code} Message: {error.Error.Message} Reason: {error.Error.Reason} StatusCode: {error.Error.StatusCode} Stack: {error.Error.Stack}"
62+
);
63+
}
64+
65+
var content = request.downloadHandler.text;
66+
var data = JsonConvert.DeserializeObject<FiatCurrenciesResponse>(content);
67+
return data.Result.FiatCurrencies;
68+
}
69+
}
70+
}

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyWithFiatCurrencies.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using UnityEngine.Networking;
4+
using Newtonsoft.Json;
5+
using System.Linq;
6+
using Thirdweb.Redcode.Awaiting;
7+
using System.Threading.Tasks;
8+
using System.Diagnostics;
9+
10+
namespace Thirdweb.Pay
11+
{
12+
public static partial class ThirdwebPay
13+
{
14+
/// <summary>
15+
/// Get a quote containing an onramp link for a fiat to crypto swap.
16+
/// </summary>
17+
/// <param name="buyWithFiatParams">Fiat onramp parameters <see cref="BuyWithFiatQuoteParams"/></param>
18+
/// <returns>Fiat quote object <see cref="BuyWithFiatQuoteResult"/></returns>
19+
public static async Task<BuyWithFiatQuoteResult> GetBuyWithFiatQuote(BuyWithFiatQuoteParams buyWithFiatParams)
20+
{
21+
if (string.IsNullOrEmpty(Utils.GetClientId()))
22+
{
23+
throw new Exception("Client ID is not set. Please set it in the ThirdwebManager.");
24+
}
25+
26+
var queryString = new Dictionary<string, string>
27+
{
28+
{ "fromCurrencySymbol", buyWithFiatParams.FromCurrencySymbol },
29+
{ "fromAmount", buyWithFiatParams.FromAmount },
30+
{ "fromAmountUnits", buyWithFiatParams.FromAmountUnits },
31+
{ "toAddress", buyWithFiatParams.ToAddress },
32+
{ "toChainId", buyWithFiatParams.ToChainId },
33+
{ "toTokenAddress", buyWithFiatParams.ToTokenAddress },
34+
{ "toAmount", buyWithFiatParams.ToAmount },
35+
{ "toAmountWei", buyWithFiatParams.ToAmountWei },
36+
{ "maxSlippageBPS", buyWithFiatParams.MaxSlippageBPS?.ToString() }
37+
};
38+
39+
var queryStringFormatted = string.Join("&", queryString.Where(kv => kv.Value != null).Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
40+
var url = $"{Constants.THIRDWEB_PAY_FIAT_QUOTE_ENDPOINT}?{queryStringFormatted}";
41+
url += buyWithFiatParams.IsTestMode ? "&isTestMode=true" : "&isTestMode=false";
42+
43+
using var request = UnityWebRequest.Get(url);
44+
45+
request.SetRequestHeader("x-sdk-name", "UnitySDK");
46+
request.SetRequestHeader("x-sdk-os", Utils.GetRuntimePlatform());
47+
request.SetRequestHeader("x-sdk-platform", "unity");
48+
request.SetRequestHeader("x-sdk-version", ThirdwebSDK.version);
49+
request.SetRequestHeader("x-client-id", Utils.GetClientId());
50+
if (!Utils.IsWebGLBuild())
51+
request.SetRequestHeader("x-bundle-id", Utils.GetBundleId());
52+
53+
await request.SendWebRequest();
54+
55+
if (request.result != UnityWebRequest.Result.Success)
56+
{
57+
ErrorResponse error;
58+
try
59+
{
60+
error = JsonConvert.DeserializeObject<ErrorResponse>(request.downloadHandler.text);
61+
}
62+
catch
63+
{
64+
error = new ErrorResponse
65+
{
66+
Error = new ErrorDetails
67+
{
68+
Message = "Unknown error",
69+
Reason = "Unknown",
70+
Code = "Unknown",
71+
Stack = "Unknown",
72+
StatusCode = (int)request.responseCode
73+
}
74+
};
75+
}
76+
77+
throw new Exception(
78+
$"HTTP error! Code: {error.Error.Code} Message: {error.Error.Message} Reason: {error.Error.Reason} StatusCode: {error.Error.StatusCode} Stack: {error.Error.Stack}"
79+
);
80+
}
81+
82+
var content = request.downloadHandler.text;
83+
var data = JsonConvert.DeserializeObject<GetFiatQuoteResponse>(content);
84+
return data.Result;
85+
}
86+
}
87+
}

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyWithFiatQuote.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using UnityEngine.Networking;
4+
using Newtonsoft.Json;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
using Thirdweb.Redcode.Awaiting;
8+
9+
namespace Thirdweb.Pay
10+
{
11+
public static partial class ThirdwebPay
12+
{
13+
/// <summary>
14+
/// Get onramp status for a quote id.
15+
/// </summary>
16+
/// <param name="intentId">Intent ID to get onramp status for</param>
17+
/// <returns>Onramp status object <see cref="BuyWithFiatStatusResult"/></returns>
18+
public static async Task<BuyWithFiatStatusResult> GetBuyWithFiatStatus(string intentId)
19+
{
20+
if (string.IsNullOrEmpty(Utils.GetClientId()))
21+
{
22+
throw new Exception("Client ID is not set. Please set it in the ThirdwebManager.");
23+
}
24+
25+
if (string.IsNullOrEmpty(intentId))
26+
{
27+
throw new ArgumentNullException(nameof(intentId));
28+
}
29+
30+
var queryString = new Dictionary<string, string> { { "intentId", intentId } };
31+
32+
var queryStringFormatted = string.Join("&", queryString.Where(kv => kv.Value != null).Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
33+
var url = $"{Constants.THIRDWEB_PAY_FIAT_STATUS_ENDPOINT}?{queryStringFormatted}";
34+
35+
using var request = UnityWebRequest.Get(url);
36+
37+
request.SetRequestHeader("x-sdk-name", "UnitySDK");
38+
request.SetRequestHeader("x-sdk-os", Utils.GetRuntimePlatform());
39+
request.SetRequestHeader("x-sdk-platform", "unity");
40+
request.SetRequestHeader("x-sdk-version", ThirdwebSDK.version);
41+
request.SetRequestHeader("x-client-id", ThirdwebManager.Instance.SDK.Session.Options.clientId);
42+
if (!Utils.IsWebGLBuild())
43+
request.SetRequestHeader("x-bundle-id", ThirdwebManager.Instance.SDK.Session.Options.bundleId);
44+
45+
await request.SendWebRequest();
46+
47+
if (request.result != UnityWebRequest.Result.Success)
48+
{
49+
ErrorResponse error;
50+
try
51+
{
52+
error = JsonConvert.DeserializeObject<ErrorResponse>(request.downloadHandler.text);
53+
}
54+
catch
55+
{
56+
error = new ErrorResponse
57+
{
58+
Error = new ErrorDetails
59+
{
60+
Message = "Unknown error",
61+
Reason = "Unknown",
62+
Code = "Unknown",
63+
Stack = "Unknown",
64+
StatusCode = (int)request.responseCode
65+
}
66+
};
67+
}
68+
69+
throw new Exception(
70+
$"HTTP error! Code: {error.Error.Code} Message: {error.Error.Message} Reason: {error.Error.Reason} StatusCode: {error.Error.StatusCode} Stack: {error.Error.Stack}"
71+
);
72+
}
73+
74+
var content = request.downloadHandler.text;
75+
var data = JsonConvert.DeserializeObject<OnRampStatusResponse>(content);
76+
return data.Result;
77+
}
78+
}
79+
}

Assets/Thirdweb/Core/Scripts/Pay/ThirdwebPay.GetBuyWithFiatStatus.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)