diff --git a/Config/DefaultImmutable.ini b/Config/DefaultImmutable.ini index 4c804c3..2adadae 100644 --- a/Config/DefaultImmutable.ini +++ b/Config/DefaultImmutable.ini @@ -4,3 +4,5 @@ BaseUrls=((Sandbox, "https://checkout-playground.sandbox.immutable.com/checkout/swap"),(Production, "https://toolkit.immutable.com/checkout/swap")) ApiKeys=((Sandbox, "pk_imapik-test-7-hfC5T$W$eEDE8Mc5mp"),(Production, "pk_imapik-WGd9orNd8mLdtTCTb3CP")) +[/Script/Immutable.ImtblBridgeRequest] +BaseUrls=((Sandbox, "https://checkout-playground.sandbox.immutable.com/checkout/squid"),(Production, "https://toolkit.immutable.com/checkout/squid")) diff --git a/Content/BlueprintSampleContent/ImtblAuthenticatedWidget4_26.uasset b/Content/BlueprintSampleContent/ImtblAuthenticatedWidget4_26.uasset index b66362c..94bf041 100644 Binary files a/Content/BlueprintSampleContent/ImtblAuthenticatedWidget4_26.uasset and b/Content/BlueprintSampleContent/ImtblAuthenticatedWidget4_26.uasset differ diff --git a/Content/BlueprintSampleContent/Marketplace/ImtblBridgeWidget4_26.uasset b/Content/BlueprintSampleContent/Marketplace/ImtblBridgeWidget4_26.uasset new file mode 100644 index 0000000..163c52f Binary files /dev/null and b/Content/BlueprintSampleContent/Marketplace/ImtblBridgeWidget4_26.uasset differ diff --git a/Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp b/Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp new file mode 100644 index 0000000..7251ee6 --- /dev/null +++ b/Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp @@ -0,0 +1,73 @@ +#include "Immutable/Marketplace/ImtblBridgeRequest.h" + +#include "GenericPlatform/GenericPlatformHttp.h" + +FString FImtblBridgeRequestQueryParams::GetPercentEncodedUrl() const +{ + TArray QueryParams; + + if (!FromChainID.IsEmpty()) + { + QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromChain"), *FGenericPlatformHttp::UrlEncode(FromChainID))); + } + + if (!FromTokenAddress.IsEmpty()) + { + // Token address is case-sensitive. + QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromToken"), *FGenericPlatformHttp::UrlEncode(FromTokenAddress.ToLower()))); + } + + if (!ToChainID.IsEmpty()) + { + QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toChain"), *FGenericPlatformHttp::UrlEncode(ToChainID))); + } + + if (!ToTokenAddress.IsEmpty()) + { + // Token address is case-sensitive. + QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toToken"), *FGenericPlatformHttp::UrlEncode(ToTokenAddress.ToLower()))); + } + + return FString::Join(QueryParams, TEXT("&")); +} + +bool UImtblBridgeRequest::GetBaseUrl(EImtblEnvironment Environment, FString& BaseUrl) const +{ + if (const FString* Find = BaseUrls.Find(Environment)) + { + BaseUrl = *Find; + + return true; + } + + return true; +} + +bool UImtblBridgeRequest::ComputePath(FString& ComputedPath, EImtblEnvironment Environment, FString FromChainID, FString FromTokenAddress, FString ToChainID, FString ToTokenAddress) const +{ + FString BaseUrl; + bool bFoundBaseUrl = GetBaseUrl(Environment, BaseUrl); + + if (!bFoundBaseUrl) + { + return false; + } + + FImtblBridgeRequestQueryParams QueryParams; + QueryParams.FromChainID = FromChainID; + QueryParams.FromTokenAddress = FromTokenAddress; + QueryParams.ToChainID = ToChainID; + QueryParams.ToTokenAddress = ToTokenAddress; + + const FString QueryParamsPercentEncodedUrl = QueryParams.GetPercentEncodedUrl(); + + ComputedPath = FString::Printf + ( + TEXT("%s%s%s"), + *BaseUrl, + !QueryParamsPercentEncodedUrl.IsEmpty() ? TEXT("?") : TEXT(""), + *QueryParamsPercentEncodedUrl + ); + + return true; +} \ No newline at end of file diff --git a/Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h b/Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h new file mode 100644 index 0000000..49fa9f3 --- /dev/null +++ b/Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h @@ -0,0 +1,71 @@ +#pragma once + +#include "ImtblBridgeRequest.generated.h" + +/** + * Bridge request query params + */ +USTRUCT(BlueprintType) +struct FImtblBridgeRequestQueryParams +{ + GENERATED_BODY() + +public: + FString GetPercentEncodedUrl() const; + +public: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") + FString FromChainID; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") + FString FromTokenAddress; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") + FString ToChainID; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") + FString ToTokenAddress; +}; + +/** + * Functionality to generate bridge requests + */ +UCLASS(BlueprintType, Config = "Immutable", DefaultConfig) +class IMMUTABLE_API UImtblBridgeRequest : public UObject +{ + GENERATED_BODY() + +public: + /** + * Finds the base url associated with the environment. + * + * @param Environment The environment that will be used to look the value up. Only sandbox and production environment are supported. + * @param BaseUrl The base url associated with the key. + * @return True if an item was found (False indicates nothing in the map uses the provided environment). + */ + UFUNCTION(BlueprintPure, Category = "Immutable") + bool GetBaseUrl(EImtblEnvironment Environment, FString& BaseUrl) const; + + /** + * Generates a link for the bridge flow. + * + * @param ComputedPath [Out] The generated link. + * @param Environment [In] The environment for which the path is being computed for (e.g. sandbox, production). + * @param FromChainID [Optional] The ID of the source blockchain. Default value is an empty string. + * @param FromTokenAddress [Optional] The contract address of the token being bridged from. + * This should be a contract address of a token on the source blockchain. + * Default value is an empty string. + * @param ToChainID [Optional] The ID of the destination blockchain. Default value is an empty string. + * @param ToTokenAddress [Optional] The contract address of the token being bridged to. + * This should be a contract address of a token on the destination blockchain. + * Default is an empty string. + * + * @return True if link was computed (False indicates link failed to compute). + */ + UFUNCTION(BlueprintCallable, BlueprintPure = "False", Category = "Immutable") + bool ComputePath(FString& ComputedPath, EImtblEnvironment Environment, FString FromChainID = TEXT(""), FString FromTokenAddress = TEXT(""), FString ToChainID = TEXT(""), FString ToTokenAddress = TEXT("")) const; + +public: + UPROPERTY(Config, EditDefaultsOnly, BlueprintReadOnly, Category = "Immutable") + TMap BaseUrls; +}; \ No newline at end of file