diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini index c7b5e96..4f1c49d 100644 --- a/Config/DefaultGame.ini +++ b/Config/DefaultGame.ini @@ -13,3 +13,6 @@ LogoutURI="immutablerunner://logout" Environment=sandbox RedirectURI="immutablerunner://callback" +[/Script/Immutable.ImmutablePluginSettings] +DefaultApplicationConfig=BlueprintGeneratedClass'/Game/ImmutableConfig.ImmutableConfig_C' + diff --git a/Content/ImmutableConfig.uasset b/Content/ImmutableConfig.uasset new file mode 100644 index 0000000..971419f --- /dev/null +++ b/Content/ImmutableConfig.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:357ce3c796765a3d20ea43bfa9107ba4cb93014d670dc9ce3ad8155cae748ccf +size 6149 diff --git a/Source/SampleGame426/Private/CustomLocalPlayer.cpp b/Source/SampleGame426/Private/CustomLocalPlayer.cpp index 11fdf5a..2cf00d1 100644 --- a/Source/SampleGame426/Private/CustomLocalPlayer.cpp +++ b/Source/SampleGame426/Private/CustomLocalPlayer.cpp @@ -6,6 +6,7 @@ #include "APIOrderbookApiOperations.h" #include "Immutable/ImmutableSubsystem.h" +#include "Immutable/ImmutableUtilities.h" #include "Settings/SampleGameSettings.h" #include "UI/CustomGameInstance.h" @@ -130,8 +131,9 @@ void UCustomLocalPlayer::UpdateBalance() } UMarketplacePolicy* MarketplacePolicy = GetGameUIPolicy()->GetMarketplacePolicy(); + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); - if (!MarketplacePolicy) + if (!MarketplacePolicy || !ImmutableConfig) { return; } @@ -139,7 +141,7 @@ void UCustomLocalPlayer::UpdateBalance() ImmutableOrderbook::APIOrderbookApi::TokenBalanceRequest Request; Request.WalletAddress = PassportWalletAddress; - Request.ContractAddress = MarketplacePolicy->GetBalanceContractAddress(); + Request.ContractAddress = ImmutableConfig->GetTokenBalanceContractAddress(); MarketplacePolicy->GetTsSdkAPI()->TokenBalance(Request, ImmutableOrderbook::APIOrderbookApi::FTokenBalanceDelegate::CreateUObject(this, &UCustomLocalPlayer::OnBalanceUpdateResponse)); } @@ -225,14 +227,15 @@ void UCustomLocalPlayer::OnPassportIsRunning(TWeakObjectPtrClientID; - Data.logoutRedirectUri = Settings->RedirectURI; - Data.logoutRedirectUri = Settings->LogoutURI; - Data.environment = Settings->Environment; - - Passport->Initialize(Data, UImmutablePassport::FImtblPassportResponseDelegate::CreateUObject(this, &UCustomLocalPlayer::OnPassportInitialized)); + // FImmutablePassportInitData Data; + // + // Data.clientId = Settings->ClientID; + // Data.logoutRedirectUri = Settings->RedirectURI; + // Data.logoutRedirectUri = Settings->LogoutURI; + // Data.environment = Settings->Environment; + + // Passport->Initialize(Data, UImmutablePassport::FImtblPassportResponseDelegate::CreateUObject(this, &UCustomLocalPlayer::OnPassportInitialized)); + Passport->Initialize(UImmutablePassport::FImtblPassportResponseDelegate::CreateUObject(this, &UCustomLocalPlayer::OnPassportInitialized)); } } diff --git a/Source/SampleGame426/Private/UI/Inventory/SearchNFTsWidget.cpp b/Source/SampleGame426/Private/UI/Inventory/SearchNFTsWidget.cpp index 89b9f5a..9245ac8 100644 --- a/Source/SampleGame426/Private/UI/Inventory/SearchNFTsWidget.cpp +++ b/Source/SampleGame426/Private/UI/Inventory/SearchNFTsWidget.cpp @@ -10,6 +10,7 @@ #include "UIGameplayTags.h" #include "Base/AWStackWithControlPanels.h" #include "Base/ItemWidget.h" +#include "Immutable/ImmutableUtilities.h" #include "Marketplace/MarketplacePolicy.h" #include "Marketplace/SearchStacksListingWidget.h" #include "UI/Interfaces/IOpenAPIProcessorInterface.h" @@ -40,6 +41,13 @@ void USearchNfTsWidget::RefreshItemList(TOptional PageCursor) return; } + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); + + if (!ImmutableConfig) + { + return; + } + /** * Step 1(Inventory display): In order to display items in the list panel of player's Inventory, we need to send a search request to the Immutable zkEVM API. * Some request parameters are populated based on the current state of the UI Marketplace policy settings. @@ -59,11 +67,11 @@ void USearchNfTsWidget::RefreshItemList(TOptional PageCursor) */ ImmutablezkEVMAPI::APIMetadataSearchApi::SearchNFTsRequest SearchNFTsRequest; - SearchNFTsRequest.ChainName = Policy->GetChainName(); + SearchNFTsRequest.ChainName = ImmutableConfig->GetzkEVMAPIChainName(); SearchNFTsRequest.PageSize = (ListPanel->GetNumberOfColumns() * ListPanel->GetNumberOfRows()); SearchNFTsRequest.PageCursor = PageCursor; SearchNFTsRequest.AccountAddress = GetOwningCustomLocalPLayer()->GetPassportWalletAddress(); - SearchNFTsRequest.ContractAddress = Policy->GetContracts(); + SearchNFTsRequest.ContractAddress = ImmutableConfig->GetNFTContractAddresses(); SearchNFTsRequest.OnlyIncludeOwnerListings = true; Policy->GetStacksAPI()->SearchNFTs(SearchNFTsRequest, ImmutablezkEVMAPI::APIMetadataSearchApi::FSearchNFTsDelegate::CreateUObject(this, &USearchNfTsWidget::OnSearchNFTsResponse)); @@ -255,6 +263,12 @@ void USearchNfTsWidget::OnPlayerConfirmedSell(UDialog* DialogPtr, EDialogResult ProcessingDialog->DialogResultDelegate.AddUniqueDynamic(this, &USearchNfTsWidget::OnProcessDialogAction); UCustomLocalPlayer* LocalPlayer = Cast(GetOwningLocalPlayer()); + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); + + if (!ImmutableConfig) + { + return; + } /** * Step 1(Listing): Prepares a listing request for the Immutable Orderbook API. @@ -277,7 +291,7 @@ void USearchNfTsWidget::OnPlayerConfirmedSell(UDialog* DialogPtr, EDialogResult ImmutableOrderbook::APIPrepareListingRequestSell SellData; BuyData.Amount = FMathUtility::ConvertFloatValueStringToWeiString(18, Dialog->GetPrice()); - BuyData.ContractAddress = Policy->GetBalanceContractAddress(); + BuyData.ContractAddress = ImmutableConfig->GetTokenBalanceContractAddress(); BuyData.Type = ImmutableOrderbook::APIPrepareListingRequestBuy::TypeEnum::ERC20; SellData.ContractAddress = SelectedItemWidget->GetContractAddress(); @@ -525,9 +539,16 @@ void USearchNfTsWidget::OnProcessDialogAction(UDialog* DialogPtr, EDialogResult void USearchNfTsWidget::ConfirmListing(const FString& ListingId) { + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); + + if (!ImmutableConfig) + { + return; + } + ImmutablezkEVMAPI::APIOrdersApi::GetListingRequest ListingRequest; - ListingRequest.ChainName = Policy->GetChainName(); + ListingRequest.ChainName = ImmutableConfig->GetzkEVMAPIChainName(); ListingRequest.ChainName = ListingId; Policy->GetOrdersAPI()->GetListing(ListingRequest, ImmutablezkEVMAPI::APIOrdersApi::FGetListingDelegate::CreateUObject(this, &USearchNfTsWidget::OnGetListing)); diff --git a/Source/SampleGame426/Private/UI/Marketplace/MarketplacePolicy.cpp b/Source/SampleGame426/Private/UI/Marketplace/MarketplacePolicy.cpp index e05335c..58e5c59 100644 --- a/Source/SampleGame426/Private/UI/Marketplace/MarketplacePolicy.cpp +++ b/Source/SampleGame426/Private/UI/Marketplace/MarketplacePolicy.cpp @@ -5,26 +5,29 @@ #include "APIMetadataSearchApiOperations.h" #include "Dialog/DialogSubsystem.h" #include "Engine/DataTable.h" +#include "Immutable/ImmutableUtilities.h" void UMarketplacePolicy::PostInitProperties() { UObject::PostInitProperties(); + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); + HttpRetryManager = MakeUnique(RetryLimitCount, RetryTimeoutRelativeSeconds); MetadataSearchAPI = MakeUnique(); - MetadataSearchAPI->SetURL(ImmutableAPIURL); + MetadataSearchAPI->SetURL(ImmutableConfig->GetzkEVMAPIURL()); MetadataSearchAPI->AddHeaderParam(TEXT("Accept"), TEXT("application/json")); MetadataSearchAPI->SetHttpRetryManager(*HttpRetryManager); OrdersAPI = MakeUnique(); - OrdersAPI->SetURL(ImmutableAPIURL); + OrdersAPI->SetURL(ImmutableConfig->GetzkEVMAPIURL()); OrdersAPI->AddHeaderParam(TEXT("Accept"), TEXT("application/json")); OrdersAPI->SetHttpRetryManager(*HttpRetryManager); TsSdkAPI = MakeUnique(); - TsSdkAPI->SetURL(TsSdkAPIURL); + TsSdkAPI->SetURL(ImmutableConfig->GetOrderbookAPIURL()); } UDataTable* UMarketplacePolicy::GetNFTDatatable() @@ -37,11 +40,6 @@ ImmutableOrderbook::APIOrderbookApi* UMarketplacePolicy::GetTsSdkAPI() return TsSdkAPI.Get(); } -FString UMarketplacePolicy::GetBalanceContractAddress() const -{ - return BalanceContractAddress; -} - void UMarketplacePolicy::SetKeyword(const FString& Keyword) { if (!Keyword.TrimStartAndEnd().IsEmpty()) diff --git a/Source/SampleGame426/Private/UI/Marketplace/SearchStacksContractSelectWidget.cpp b/Source/SampleGame426/Private/UI/Marketplace/SearchStacksContractSelectWidget.cpp index 66cb079..16a77a6 100644 --- a/Source/SampleGame426/Private/UI/Marketplace/SearchStacksContractSelectWidget.cpp +++ b/Source/SampleGame426/Private/UI/Marketplace/SearchStacksContractSelectWidget.cpp @@ -6,6 +6,7 @@ #include "Base/AWStackWithControlPanels.h" #include "Base/ItemWidget.h" #include "Components/GridPanel.h" +#include "Immutable/ImmutableUtilities.h" #include "Marketplace/MarketplacePolicy.h" @@ -55,14 +56,14 @@ void USearchStacksContractSelectWidget::Refresh() void USearchStacksContractSelectWidget::LoadContracts() { - UMarketplacePolicy* Policy = GetOwningCustomLocalPLayer()->GetGameUIPolicy()->GetMarketplacePolicy(); + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); - if (!Policy || !GridPanel) + if (!GridPanel || !ImmutableConfig) { return; } - auto& Contracts = Policy->GetContracts(); + auto& Contracts = ImmutableConfig->GetNFTContractAddresses(); for (auto Contract : Contracts) { diff --git a/Source/SampleGame426/Private/UI/Marketplace/SearchStacksOptionWidget.cpp b/Source/SampleGame426/Private/UI/Marketplace/SearchStacksOptionWidget.cpp index afb0089..1c8f0c3 100644 --- a/Source/SampleGame426/Private/UI/Marketplace/SearchStacksOptionWidget.cpp +++ b/Source/SampleGame426/Private/UI/Marketplace/SearchStacksOptionWidget.cpp @@ -6,14 +6,16 @@ #include "GameUIPolicy.h" #include "UIGameplayTags.h" #include "Base/AWStackWithControlPanels.h" +#include "Immutable/ImmutableUtilities.h" #include "Marketplace/MarketplacePolicy.h" void USearchStacksOptionWidget::RefreshItemList(TOptional PageCursor) { UMarketplacePolicy* Policy = GetOwningCustomLocalPLayer()->GetGameUIPolicy()->GetMarketplacePolicy(); + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); - if (!Policy) + if (!Policy || !ImmutableConfig) { return; } @@ -21,7 +23,7 @@ void USearchStacksOptionWidget::RefreshItemList(TOptional PageCursor) ImmutablezkEVMAPI::APIMetadataSearchApi::ListFiltersRequest ListFiltersRequest; ListFiltersRequest.ContractAddress = Policy->GetSelectedContractAddress(); - ListFiltersRequest.ChainName = Policy->GetChainName(); + ListFiltersRequest.ChainName = ImmutableConfig->GetzkEVMAPIChainName(); Policy->GetStacksAPI()->ListFilters(ListFiltersRequest, ImmutablezkEVMAPI::APIMetadataSearchApi::FListFiltersDelegate::CreateUObject(this, &USearchStacksOptionWidget::OnListFiltersResponse)); } diff --git a/Source/SampleGame426/Private/UI/Marketplace/SearchStacksWidget.cpp b/Source/SampleGame426/Private/UI/Marketplace/SearchStacksWidget.cpp index 80638bb..6a45cdd 100644 --- a/Source/SampleGame426/Private/UI/Marketplace/SearchStacksWidget.cpp +++ b/Source/SampleGame426/Private/UI/Marketplace/SearchStacksWidget.cpp @@ -9,6 +9,7 @@ #include "UI/Marketplace/MarketplacePolicy.h" #include "Base/ItemWidget.h" #include "Dialog/DialogSubsystem.h" +#include "Immutable/ImmutableUtilities.h" #include "Kismet/KismetSystemLibrary.h" #include "Marketplace/SearchStacksListingWidget.h" #include "Marketplace/SearchStacksItemWidget.h" @@ -34,8 +35,9 @@ void USearchStacksWidget::RefreshItemList(TOptional PageCursor) ListPanel->ResetPanelItems(); UMarketplacePolicy* Policy = GetOwningCustomLocalPLayer()->GetGameUIPolicy()->GetMarketplacePolicy(); + UApplicationConfig* ImmutableConfig = FImmutableUtilities::GetDefaultApplicationConfig(); - if (!Policy) + if (!Policy || !ImmutableConfig) { return; } @@ -71,8 +73,8 @@ void USearchStacksWidget::RefreshItemList(TOptional PageCursor) SearchStacksRequest.PageSize = ListPanel->GetNumberOfColumns() * ListPanel->GetNumberOfRows(); SearchStacksRequest.PageCursor = PageCursor; SearchStacksRequest.AccountAddress = GetOwningCustomLocalPLayer()->GetPassportWalletAddress(); - SearchStacksRequest.ContractAddress = Policy->GetContracts(); - SearchStacksRequest.ChainName = Policy->GetChainName(); + SearchStacksRequest.ContractAddress = ImmutableConfig->GetNFTContractAddresses(); + SearchStacksRequest.ChainName = ImmutableConfig->GetzkEVMAPIChainName(); SearchStacksRequest.OnlyIfHasActiveListings = true; HandleSorting(SearchStacksRequest.SortBy); diff --git a/Source/SampleGame426/Public/UI/Marketplace/MarketplacePolicy.h b/Source/SampleGame426/Public/UI/Marketplace/MarketplacePolicy.h index cd9ea8c..899e310 100644 --- a/Source/SampleGame426/Public/UI/Marketplace/MarketplacePolicy.h +++ b/Source/SampleGame426/Public/UI/Marketplace/MarketplacePolicy.h @@ -67,26 +67,6 @@ class UMarketplacePolicy : public UObject return OrdersAPI.Get(); } - /** - * Retrieves the name of the chain used to pass to the Immutable zkEVM API and Orderbook API. - * - * @return A constant reference to an FString containing the name of the chain. - */ - const FString& GetChainName() - { - return SearchAPIChainName; - } - - /** - * Retrieves the list of NFT contracts used in the APIs' queries. - * - * @return A constant reference to an array of strings representing the contracts. - */ - const TArray& GetContracts() - { - return StackContractAddress; - } - /** * @brief Retrieves the instance of Orderbook API. * @see ImmutableOrderbook::APIOrderbookApi in ImmutableTsSdkApi plugin. @@ -95,13 +75,6 @@ class UMarketplacePolicy : public UObject */ ImmutableOrderbook::APIOrderbookApi* GetTsSdkAPI(); - /** - * @brief Retrieves the cryptocurrency contract address associated with the user's wallet balance. - * - * @return A string representing the contract address. - */ - FString GetBalanceContractAddress() const; - /** * Setter and getter of the cached keyword for the marketplace search. * @see USearchStacksOptionWidget for more details on how it is used.