Skip to content

Commit

Permalink
feat: marketplace bridge (#3191)
Browse files Browse the repository at this point in the history
  • Loading branch information
ImmutableJeffrey committed Jan 21, 2025
1 parent 4dfa0f6 commit 112a0a4
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Config/DefaultImmutable.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include "Immutable/Marketplace/ImtblBridgeRequest.h"

#include "GenericPlatform/GenericPlatformHttp.h"

FString FImtblBridgeRequestQueryParams::GetPercentEncodedUrl() const
{
TArray<FString> QueryParams;

if (!FromChainID.IsEmpty())
{
QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromChain"), *FGenericPlatformHttp::UrlEncode(FromChainID)));
}

if (!FromTokenAddress.IsEmpty())
{
QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromToken"), *FGenericPlatformHttp::UrlEncode(FromTokenAddress)));
}

if (!ToChainID.IsEmpty())
{
QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toChain"), *FGenericPlatformHttp::UrlEncode(ToChainID)));
}

if (!ToTokenAddress.IsEmpty())
{
QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toToken"), *FGenericPlatformHttp::UrlEncode(ToTokenAddress)));
}

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;
}
71 changes: 71 additions & 0 deletions Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h
Original file line number Diff line number Diff line change
@@ -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<EImtblEnvironment, FString> BaseUrls;
};

0 comments on commit 112a0a4

Please sign in to comment.