Skip to content

[DX-3550] refactor: marketplace query params #390

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions sample/Assets/Scripts/Marketplace/BridgeScript.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,13 @@ public void OpenWidget()

var link = LinkFactory.GenerateBridgeLink(
environment: environment,
fromTokenAddress: FromTokenAddress.text.IsNullOrEmpty() ? null : FromTokenAddress.text,
fromChainID: FromChain.text.IsNullOrEmpty() ? null : FromChain.text,
toTokenAddress: ToTokenAddress.text.IsNullOrEmpty() ? null : ToTokenAddress.text,
toChainID: ToChain.text.IsNullOrEmpty() ? null : ToChain.text
queryParams: new BridgeQueryParams
{
FromTokenAddress = FromTokenAddress.text.IsNullOrEmpty() ? null : FromTokenAddress.text,
FromChainID = FromChain.text.IsNullOrEmpty() ? null : FromChain.text,
ToTokenAddress = ToTokenAddress.text.IsNullOrEmpty() ? null : ToTokenAddress.text,
ToChainID = ToChain.text.IsNullOrEmpty() ? null : ToChain.text
}
);

Application.OpenURL(link);
Expand Down
20 changes: 13 additions & 7 deletions sample/Assets/Scripts/Marketplace/OnRampScript.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using AltWebSocketSharp;
using Immutable.Marketplace;
using UnityEngine;
Expand Down Expand Up @@ -49,11 +50,17 @@ public void OpenWidget()
var link = LinkFactory.GenerateOnRampLink(
environment: environment,
email: email,
address: walletAddress,
fiatCurrency: FiatCurrencyInput.text.IsNullOrEmpty() ? "USD" : FiatCurrencyInput.text,
fiatAmount: FiatAmountInput.text.IsNullOrEmpty() ? "50" : FiatAmountInput.text,
cryptoCurrency: CryptoCurrency.text.IsNullOrEmpty() ? "IMX" : CryptoCurrency.text,
cryptoCurrencyList: CryptoCurrencyList.text.IsNullOrEmpty() ? "imx,eth,usdc" : CryptoCurrencyList.text
walletAddress: walletAddress,
queryParams: new OnRampQueryParams
{
DefaultFiatCurrency = FiatCurrencyInput.text.IsNullOrEmpty() ? "USD" : FiatCurrencyInput.text,
DefaultFiatAmount = FiatAmountInput.text.IsNullOrEmpty() ? "50" : FiatAmountInput.text,
DefaultCryptoCurrency = CryptoCurrency.text.IsNullOrEmpty() ? "IMX" : CryptoCurrency.text,
CryptoCurrencyList = CryptoCurrencyList.text.IsNullOrEmpty() ? "imx,eth,usdc" : CryptoCurrencyList.text
},
extraQueryParams: new Dictionary<string, string> {
{"themeColor", "000000"}
}
);

Application.OpenURL(link);
Expand All @@ -66,5 +73,4 @@ public void Cancel()
{
SceneManager.LoadScene("MarketplaceScene");
}

}
}
7 changes: 5 additions & 2 deletions sample/Assets/Scripts/Marketplace/SwapScript.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,11 @@ public void OpenWidget()
var link = LinkFactory.GenerateSwapLink(
environment: environment,
publishableKey: publishableKey,
fromTokenAddress: FromTokenAddress.text.IsNullOrEmpty() ? null : FromTokenAddress.text,
toTokenAddress: ToTokenAddress.text.IsNullOrEmpty() ? null : ToTokenAddress.text
queryParams: new SwapQueryParams
{
FromTokenAddress = FromTokenAddress.text.IsNullOrEmpty() ? null : FromTokenAddress.text,
ToTokenAddress = ToTokenAddress.text.IsNullOrEmpty() ? null : ToTokenAddress.text
}
);

Application.OpenURL(link);
Expand Down
166 changes: 104 additions & 62 deletions src/Packages/Marketplace/Runtime/LinkFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,45 +11,97 @@ public class LinkFactory
/// </summary>
/// <param name="environment">Specifies the environment (<c>Sandbox</c> or <c>Production</c>).</param>
/// <param name="email">The user's email address, pre-filled in the on-ramp flow.</param>
/// <param name="address">The user's wallet address, where tokens will be sent.</param>
/// <param name="fiatCurrency">The fiat currency to use (default: "USD").</param>
/// <param name="fiatAmount">The amount of fiat currency to spend when purchasing cryptocurrency (default: "50").</param>
/// <param name="cryptoCurrency">The cryptocurrency to purchase (default: "IMX").</param>
/// <param name="cryptoCurrencyList">A comma-separated list of available cryptocurrencies for purchase (default: "imx,eth,usdc").</param>
/// <param name="walletAddress">The user's wallet address, where tokens will be sent.</param>
/// <param name="queryParams">The query parameters for the on-ramp flow. Uses default values if not specified.</param>
/// <param name="extraQueryParams">Optional additional query parameters. See <a href="https://docs.transak.com/docs/query-parameters">Transak docs</a> for possible fields.</param>
/// <returns>The generated on-ramp URL.</returns>
/// <remarks>
/// If <paramref name="extraQueryParams"/> includes any fields that are already defined in <paramref name="queryParams"/>,
/// the values in <paramref name="queryParams"/> will take precedence.
/// For example, if <paramref name="extraQueryParams"/> contains "defaultFiatAmount", it will be ignored and the value
/// from <paramref name="queryParams.DefaultFiatAmount"/> will be used instead.
/// </remarks>
public static string GenerateOnRampLink(
Environment environment,
string email,
string address,
string fiatCurrency = "USD",
string fiatAmount = "50",
string cryptoCurrency = "IMX",
string cryptoCurrencyList = "imx,eth,usdc"
string walletAddress,
OnRampQueryParams queryParams = default,
Dictionary<string, string>? extraQueryParams = null
)
{
var baseUrl = LinkConfig.GetBaseUrl(environment, Flow.OnRamp);
var apiKey = LinkConfig.GetApiKey(environment, Flow.OnRamp);

var queryParams = new Dictionary<string, string>
var queryParamsDictionary = new Dictionary<string, string>
{
{"apiKey", apiKey},
{"network", "immutablezkevm"},
{"defaultPaymentMethod", "credit_debit_card"},
{"disablePaymentMethods", ""},
{"productsAvailed", "buy"},
{"exchangeScreenTitle", "Buy"},
{"themeColor", "0D0D0D"},
{"defaultCryptoCurrency", cryptoCurrency},
{"email", Uri.EscapeDataString(email)},
{"isAutoFillUserData", "true"},
{"disableWalletAddressForm", "true"},
{"defaultFiatAmount", fiatAmount},
{"defaultFiatCurrency", fiatCurrency},
{"walletAddress", address},
{"cryptoCurrencyList", cryptoCurrencyList}
{ "apiKey", apiKey },
{ "cryptoCurrencyList", queryParams.CryptoCurrencyList },
{ "defaultCryptoCurrency", queryParams.DefaultCryptoCurrency },
{ "defaultFiatAmount", queryParams.DefaultFiatAmount },
{ "defaultFiatCurrency", queryParams.DefaultFiatCurrency },
{
"defaultPaymentMethod",
extraQueryParams != null &&
extraQueryParams.TryGetValue("defaultPaymentMethod", out var defaultPaymentMethod)
? defaultPaymentMethod
: "credit_debit_card"
},
{
"disablePaymentMethods",
extraQueryParams != null &&
extraQueryParams.TryGetValue("disablePaymentMethods", out var disablePaymentMethods)
? disablePaymentMethods
: ""
},
{
"disableWalletAddressForm",
extraQueryParams != null &&
extraQueryParams.TryGetValue("disableWalletAddressForm", out var disableWalletAddressForm)
? disableWalletAddressForm
: "true"
},
{ "email", Uri.EscapeDataString(email) },
{
"exchangeScreenTitle",
extraQueryParams != null &&
extraQueryParams.TryGetValue("exchangeScreenTitle", out var exchangeScreenTitle)
? exchangeScreenTitle
: "Buy"
},
{
"isAutoFillUserData",
extraQueryParams != null &&
extraQueryParams.TryGetValue("isAutoFillUserData", out var isAutoFillUserData)
? isAutoFillUserData
: "true"
},
{ "network", "immutablezkevm" },
{ "productsAvailed", "buy" },
{
"themeColor",
extraQueryParams != null && extraQueryParams.TryGetValue("themeColor", out var themeColor)
? themeColor
: "0D0D0D"
},
{ "walletAddress", walletAddress }
};

var queryString = string.Join("&", queryParams.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}").ToArray());

// Add any extra parameters that are not already in the queryParamsDictionary
if (extraQueryParams != null)
{
foreach (var kvp in extraQueryParams)
{
// Add to dictionary only if the key is not already in the dictionary
if (!queryParamsDictionary.ContainsKey(kvp.Key))
{
queryParamsDictionary[kvp.Key] = kvp.Value;
}
}
}

var queryString = string.Join("&",
queryParamsDictionary.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}").ToArray());
return $"{baseUrl}?{queryString}";
}

Expand All @@ -58,71 +110,61 @@ public static string GenerateOnRampLink(
/// </summary>
/// <param name="environment">Specifies the environment (<c>Sandbox</c> or <c>Production</c>).</param>
/// <param name="publishableKey">The publishable key obtained from <a href="https://hub.immutable.com/">Immutable Hub</a>. See <a href="https://docs.immutable.com/api/zkEVM/apikeys">API keys</a> for more details.</param>
/// <param name="fromTokenAddress">The address of the token being swapped from (default is null).</param>
/// <param name="toTokenAddress">The address of the token being swapped to (default is null).</param>
/// <returns>A swap URL</returns>
/// <param name="queryParams">The query parameters for the swap flow. Uses default values if not specified.</param>
/// <returns>The generated swap URL.</returns>
public static string GenerateSwapLink(
Environment environment,
string publishableKey,
string? fromTokenAddress = null,
string? toTokenAddress = null
SwapQueryParams queryParams = default
)
{
var baseUrl = LinkConfig.GetBaseUrl(environment, Flow.Swap);

var queryParams = new Dictionary<string, string>
var queryParamsDictionary = new Dictionary<string, string>
{
{"publishableKey", publishableKey}
{ "publishableKey", publishableKey }
};

if (!string.IsNullOrEmpty(fromTokenAddress))
{
queryParams["fromTokenAddress"] = fromTokenAddress;
}
if (!string.IsNullOrEmpty(queryParams.FromTokenAddress))
queryParamsDictionary["fromTokenAddress"] = queryParams.FromTokenAddress;

if (!string.IsNullOrEmpty(toTokenAddress))
{
queryParams["toTokenAddress"] = toTokenAddress;
}
if (!string.IsNullOrEmpty(queryParams.ToTokenAddress))
queryParamsDictionary["toTokenAddress"] = queryParams.ToTokenAddress;

var queryString = string.Join("&", queryParams.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}").ToArray());
var queryString = string.Join("&",
queryParamsDictionary.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}").ToArray());
return $"{baseUrl}?{queryString}";
}

/// <summary>
/// Generates a link for the bridge flow.
/// </summary>
/// <param name="environment">Specifies the environment (<c>Sandbox</c> or <c>Production</c>).</param>
/// <param name="fromTokenAddress">The address of the token being moved from (default is null).</param>
/// <param name="fromChainID">The ID of the source blockchain (default is null).</param>
/// <param name="toTokenAddress">The address of the token being moved to (default is null).</param>
/// <param name="toChainID">The ID of the destination blockchain (default is null).</param>
/// <returns>A bridge URL.</returns>
/// <param name="queryParams">The query parameters for the bridge flow. Uses default values if not specified.</param>
/// <returns>The generated bridge URL.</returns>
public static string GenerateBridgeLink(
Environment environment,
string? fromTokenAddress = null,
string? fromChainID = null,
string? toTokenAddress = null,
string? toChainID = null
BridgeQueryParams queryParams = default
)
{
var baseUrl = LinkConfig.GetBaseUrl(environment, Flow.Bridge);

var queryParams = new Dictionary<string, string>();
var queryParamsDictionary = new Dictionary<string, string>();

if (!string.IsNullOrEmpty(fromTokenAddress))
queryParams["fromToken"] = fromTokenAddress.ToLower();
if (!string.IsNullOrEmpty(queryParams.FromChainID))
queryParamsDictionary["fromChain"] = queryParams.FromChainID;

if (!string.IsNullOrEmpty(fromChainID))
queryParams["fromChain"] = fromChainID;
if (!string.IsNullOrEmpty(queryParams.FromTokenAddress))
queryParamsDictionary["fromToken"] = queryParams.FromTokenAddress.ToLower();

if (!string.IsNullOrEmpty(toTokenAddress))
queryParams["toToken"] = toTokenAddress.ToLower();
if (!string.IsNullOrEmpty(queryParams.ToChainID))
queryParamsDictionary["toChain"] = queryParams.ToChainID;

if (!string.IsNullOrEmpty(toChainID))
queryParams["toChain"] = toChainID;
if (!string.IsNullOrEmpty(queryParams.ToTokenAddress))
queryParamsDictionary["toToken"] = queryParams.ToTokenAddress.ToLower();

var queryString = string.Join("&", queryParams.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}").ToArray());
var queryString = string.Join("&",
queryParamsDictionary.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}").ToArray());
return $"{baseUrl}?{queryString}";
}
}
Expand Down
70 changes: 70 additions & 0 deletions src/Packages/Marketplace/Runtime/LinkQueryParams.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
namespace Immutable.Marketplace
{
/// <summary>
/// Represents the query parameters for generating an on-ramp URL.
/// </summary>
public struct OnRampQueryParams
{
/// <summary>
/// The cryptocurrency to purchase (default: "IMX").
/// </summary>
public string DefaultCryptoCurrency { get; set; }

/// <summary>
/// The amount of fiat currency to spend when purchasing cryptocurrency (default: "50").
/// </summary>
public string DefaultFiatAmount { get; set; }

/// <summary>
/// The fiat currency to use (default: "USD").
/// </summary>
public string DefaultFiatCurrency { get; set; }

/// <summary>
/// A comma-separated list of available cryptocurrencies for purchase (default: "imx,eth,usdc").
/// </summary>
public string CryptoCurrencyList { get; set; }
}

/// <summary>
/// Represents the query parameters for generating a swap URL.
/// </summary>
public struct SwapQueryParams
{
/// <summary>
/// The address of the token being swapped from (default is null).
/// </summary>
public string? FromTokenAddress { get; set; }

/// <summary>
/// The address of the token being swapped to (default is null).
/// </summary>
public string? ToTokenAddress { get; set; }
}

/// <summary>
/// Represents the query parameters for generating a bridge URL.
/// </summary>
public struct BridgeQueryParams
{
/// <summary>
/// The ID of the source blockchain (default is null).
/// </summary>
public string? FromChainID { get; set; }

/// <summary>
/// The address of the token being moved from (default is null).
/// </summary>
public string? FromTokenAddress { get; set; }

/// <summary>
/// The ID of the destination blockchain (default is null).
/// </summary>
public string? ToChainID { get; set; }

/// <summary>
/// The address of the token being moved to (default is null).
/// </summary>
public string? ToTokenAddress { get; set; }
}
}
3 changes: 3 additions & 0 deletions src/Packages/Marketplace/Runtime/LinkQueryParams.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading