From 4bffc46fd1a2babe7de4c065ee9a747184b26fc3 Mon Sep 17 00:00:00 2001 From: Jan Dohring Date: Fri, 7 Feb 2025 14:43:37 -0500 Subject: [PATCH 01/48] test fix --- .../GetFloorOrderTest.cpp | 22 +++++++++++++++ ...tHighestPriceListingForCollectibleTest.cpp | 22 +++++++++++++++ ...GetHighestPriceOfferForCollectibleTest.cpp | 22 +++++++++++++++ ...etLowestPriceListingForCollectibleTest.cpp | 22 +++++++++++++++ .../GetLowestPriceOfferForCollectibleTest.cpp | 23 +++++++++++++++ ...stingsWithLowestPriceListingsFirstTest.cpp | 22 +++++++++++++++ ...tibleOffersWithHighestPricedOfferFirst.cpp | 22 +++++++++++++++ .../ListAllListingsForCollectibleTest.cpp | 22 +++++++++++++++ .../ListAllOffersForCollectibleTest.cpp | 28 +++++++++++++++++-- .../ListCurrenciesTest.cpp | 22 +++++++++++++++ 10 files changed, 224 insertions(+), 3 deletions(-) diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetFloorOrderTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetFloorOrderTest.cpp index 7d93877d3..29bd7ae7c 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetFloorOrderTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetFloorOrderTest.cpp @@ -14,6 +14,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FGetFloorOrderTest, "SequencePlugin.EndToEnd.MarketplaceTests.GetFloorOrder", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FGetFloorOrderTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FGetFloorOrderTest); + +bool FGetFloorOrderTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FGetFloorOrderTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FGetFloorOrderTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FGetFloorOrderTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -55,6 +76,7 @@ bool FGetFloorOrderTest::RunTest(const FString& Parameters) GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FGetFloorOrderTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceListingForCollectibleTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceListingForCollectibleTest.cpp index 5ce963020..7e22b66c3 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceListingForCollectibleTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceListingForCollectibleTest.cpp @@ -12,6 +12,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FGetHighestPriceListingForCollectibleTest, "SequencePlugin.EndToEnd.MarketplaceTests.GetHighestPriceListingForCollectibleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FGetHighestPriceListingForCollectibleTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FGetHighestPriceListingForCollectibleTest); + +bool FGetHighestPriceListingForCollectibleTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FGetHighestPriceListingForCollectibleTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FGetHighestPriceListingForCollectibleTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FGetHighestPriceListingForCollectibleTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -54,6 +75,7 @@ bool FGetHighestPriceListingForCollectibleTest::RunTest(const FString& Parameter GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FGetHighestPriceListingForCollectibleTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceOfferForCollectibleTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceOfferForCollectibleTest.cpp index 28d0f3ded..01b74523f 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceOfferForCollectibleTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetHighestPriceOfferForCollectibleTest.cpp @@ -12,6 +12,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FGetHighestPriceOfferForCollectibleTest, "SequencePlugin.EndToEnd.MarketplaceTests.GetHighestPriceOfferForCollectibleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FGetHighestPriceOfferForCollectibleTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FGetHighestPriceOfferForCollectibleTest); + +bool FGetHighestPriceOfferForCollectibleTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FGetHighestPriceOfferForCollectibleTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FGetHighestPriceOfferForCollectibleTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FGetHighestPriceOfferForCollectibleTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -54,6 +75,7 @@ bool FGetHighestPriceOfferForCollectibleTest::RunTest(const FString& Parameters) GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FGetHighestPriceOfferForCollectibleTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceListingForCollectibleTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceListingForCollectibleTest.cpp index c23997966..868330f08 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceListingForCollectibleTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceListingForCollectibleTest.cpp @@ -12,6 +12,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FGetLowestPriceListingForCollectibleTest, "SequencePlugin.EndToEnd.MarketplaceTests.GetLowestPriceListingForCollectibleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FGetLowestPriceListingForCollectibleTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FGetLowestPriceListingForCollectibleTest); + +bool FGetLowestPriceListingForCollectibleTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FGetLowestPriceListingForCollectibleTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FGetLowestPriceListingForCollectibleTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FGetLowestPriceListingForCollectibleTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -54,6 +75,7 @@ bool FGetLowestPriceListingForCollectibleTest::RunTest(const FString& Parameters GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FGetLowestPriceListingForCollectibleTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceOfferForCollectibleTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceOfferForCollectibleTest.cpp index 598677184..9242ea6e1 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceOfferForCollectibleTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/GetLowestPriceOfferForCollectibleTest.cpp @@ -12,6 +12,28 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FGetLowestPriceOfferForCollectibleTest, "SequencePlugin.EndToEnd.MarketplaceTests.GetLowestPriceOfferForCollectibleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FGetLowestPriceOfferForCollectibleTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FGetLowestPriceOfferForCollectibleTest); + +bool FGetLowestPriceOfferForCollectibleTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FGetLowestPriceOfferForCollectibleTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FGetLowestPriceOfferForCollectibleTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} + void FGetLowestPriceOfferForCollectibleTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -54,6 +76,7 @@ bool FGetLowestPriceOfferForCollectibleTest::RunTest(const FString& Parameters) GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FGetLowestPriceOfferForCollectibleTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleListingsWithLowestPriceListingsFirstTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleListingsWithLowestPriceListingsFirstTest.cpp index 706b12153..cdf6ecb6e 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleListingsWithLowestPriceListingsFirstTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleListingsWithLowestPriceListingsFirstTest.cpp @@ -12,6 +12,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FListAllCollectibleListingsWithLowestPriceListingsFirstTest, "SequencePlugin.EndToEnd.MarketplaceTests.ListAllCollectibleListingsWithLowestPriceListingsFirstTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FListAllCollectibleListingsWithLowestPriceListingsFirstTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FListAllCollectibleListingsWithLowestPriceListingsFirstTest); + +bool FListAllCollectibleListingsWithLowestPriceListingsFirstTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FListAllCollectibleListingsWithLowestPriceListingsFirstTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FListAllCollectibleListingsWithLowestPriceListingsFirstTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FListAllCollectibleListingsWithLowestPriceListingsFirstTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -69,6 +90,7 @@ bool FListAllCollectibleListingsWithLowestPriceListingsFirstTest::RunTest(const GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FListAllCollectibleListingsWithLowestPriceListingsFirstTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleOffersWithHighestPricedOfferFirst.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleOffersWithHighestPricedOfferFirst.cpp index 0ed4fb16b..b8bb1dc6d 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleOffersWithHighestPricedOfferFirst.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllCollectibleOffersWithHighestPricedOfferFirst.cpp @@ -12,6 +12,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FListCollectibleOffersWithHighestPricedOfferFirst, "SequencePlugin.EndToEnd.MarketplaceTests.ListCollectibleOffersWithHighestPricedOfferFirst", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FListCollectibleOffersWithHighestPricedOfferFirstIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FListCollectibleOffersWithHighestPricedOfferFirst); + +bool FListCollectibleOffersWithHighestPricedOfferFirstIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FListCollectibleOffersWithHighestPricedOfferFirst->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FListCollectibleOffersWithHighestPricedOfferFirst->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FListCollectibleOffersWithHighestPricedOfferFirst::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -69,6 +90,7 @@ bool FListCollectibleOffersWithHighestPricedOfferFirst::RunTest(const FString& P GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FListCollectibleOffersWithHighestPricedOfferFirstIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllListingsForCollectibleTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllListingsForCollectibleTest.cpp index d36449789..70c6560f4 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllListingsForCollectibleTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllListingsForCollectibleTest.cpp @@ -14,6 +14,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FListAllListingsForCollectible, "SequencePlugin.EndToEnd.MarketplaceTests.ListAllListingsForCollectible", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FListAllListingsForCollectibleIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FListAllListingsForCollectible); + +bool FListAllListingsForCollectibleIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FListAllListingsForCollectible->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FListAllListingsForCollectible->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FListAllListingsForCollectible::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -72,6 +93,7 @@ bool FListAllListingsForCollectible::RunTest(const FString& Parameters) GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FListAllListingsForCollectibleIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllOffersForCollectibleTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllOffersForCollectibleTest.cpp index 40c748320..61b269e74 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllOffersForCollectibleTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListAllOffersForCollectibleTest.cpp @@ -12,16 +12,37 @@ #include "Tests/AutomationEditorCommon.h" #include "JsonObjectConverter.h" -IMPLEMENT_COMPLEX_AUTOMATION_TEST(FListAllOffersForCollectible, "SequencePlugin.EndToEnd.MarketplaceTests.ListAllOffersForCollectible", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FListAllOffersForCollectibleTest, "SequencePlugin.EndToEnd.MarketplaceTests.ListAllOffersForCollectible", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FListAllOffersForCollectibleTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FListAllOffersForCollectibleTest); -void FListAllOffersForCollectible::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +bool FListAllOffersForCollectibleTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FListAllOffersForCollectibleTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FListAllOffersForCollectibleTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} + +void FListAllOffersForCollectibleTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { OutBeautifiedNames.Add(TEXT("List All Offers For Collectible Test")); OutTestCommands.Add(TEXT("")); } -bool FListAllOffersForCollectible::RunTest(const FString& Parameters) +bool FListAllOffersForCollectibleTest::RunTest(const FString& Parameters) { AddInfo(TEXT("Testing List All Offers For Collectible")); ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); @@ -72,6 +93,7 @@ bool FListAllOffersForCollectible::RunTest(const FString& Parameters) GenericFailure ); + ADD_LATENT_AUTOMATION_COMMAND(FListAllOffersForCollectibleTestIsDone(MarketplaceTestData, this)); return true; })); return true; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListCurrenciesTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListCurrenciesTest.cpp index 2c38d281f..26205eaca 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListCurrenciesTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/MarketplaceEndToEndTests/ListCurrenciesTest.cpp @@ -12,6 +12,27 @@ IMPLEMENT_COMPLEX_AUTOMATION_TEST(FListCurrenciesTest, "SequencePlugin.EndToEnd.MarketplaceTests.ListCurrenciesTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext) +/* Latent command used to poll off main thread to see if our requests are done */ +DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FListCurrenciesTestIsDone, const UMarketplaceRequestsTestData *, MarketPlaceRequestsTestData, FAutomationTestBase *, FListCurrenciesTest); + +bool FListCurrenciesTestIsDone::Update() +{ + while(this->MarketPlaceRequestsTestData->GetPendingRequests() > 0) + { + return false; + } + + if (this->MarketPlaceRequestsTestData->GetAllRequestsSuccessful()) + { + FListCurrenciesTest->AddInfo(TEXT("GetFloorOrderTest request completed")); + } + else + { + FListCurrenciesTest->AddError(FString::Printf(TEXT("GetFloorOrderTest request failed"))); + } + + return true; +} void FListCurrenciesTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { @@ -58,6 +79,7 @@ bool FListCurrenciesTest::RunTest(const FString& Parameters) GenericSuccess(Currencies); }, GenericFailure); + ADD_LATENT_AUTOMATION_COMMAND(FListCurrenciesTestIsDone(MarketplaceTestData, this)); return true; })); return true; From 5f67b3851eb69070c2e60db12c82f4bb773485c3 Mon Sep 17 00:00:00 2001 From: Jan Dohring Date: Wed, 12 Feb 2025 09:06:02 -0500 Subject: [PATCH 02/48] Blueprint support --- .../Config/DefaultSequencePlugin.ini | 3 + .../Core/Sqn_Mngrs/BP_SequenceManager.uasset | 4 +- .../Integrators/SequenceMarketplaceBP.cpp | 342 +++++++++++++++++- .../Integrators/SequenceMarketplaceBP.h | 106 +++++- 4 files changed, 442 insertions(+), 13 deletions(-) create mode 100644 Plugins/SequencePlugin/Config/DefaultSequencePlugin.ini diff --git a/Plugins/SequencePlugin/Config/DefaultSequencePlugin.ini b/Plugins/SequencePlugin/Config/DefaultSequencePlugin.ini new file mode 100644 index 000000000..7ee715fab --- /dev/null +++ b/Plugins/SequencePlugin/Config/DefaultSequencePlugin.ini @@ -0,0 +1,3 @@ +[CoreRedirects] ++FunctionRedirects=(OldName="/Script/SequencePlugin.SequenceMarketplaceBP.GetCollectiblesWithLowestListingsAsync",NewName="/Script/SequencePlugin.SequenceMarketplaceBP.GetCollectiblesWithLowestListingsFirstAsync") ++FunctionRedirects=(OldName="/Script/SequencePlugin.SequenceMarketplaceBP.GetCollectiblesWithHighestListingsFirstAsync",NewName="/Script/SequencePlugin.SequenceMarketplaceBP.GetCollectiblesWithHighestPricedOffersFirstAsync") \ No newline at end of file diff --git a/Plugins/SequencePlugin/Content/Core/Sqn_Mngrs/BP_SequenceManager.uasset b/Plugins/SequencePlugin/Content/Core/Sqn_Mngrs/BP_SequenceManager.uasset index 11ff6d7c5..ede8cf932 100644 --- a/Plugins/SequencePlugin/Content/Core/Sqn_Mngrs/BP_SequenceManager.uasset +++ b/Plugins/SequencePlugin/Content/Core/Sqn_Mngrs/BP_SequenceManager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:671ee0065607782a801ef3cbd180b941111a36852179400bf65a26765b449f6d -size 1554024 +oid sha256:d8ba87d7572303bb099d0373d1202b9095f0cd97dc73c4edeed1dc34b839ac2f +size 1537279 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceMarketplaceBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceMarketplaceBP.cpp index e8d80ebe1..c798adec7 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceMarketplaceBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceMarketplaceBP.cpp @@ -1,6 +1,7 @@ #include "Integrators/SequenceMarketplaceBP.h" #include "Engine/Engine.h" #include "Engine/GameInstance.h" +#include "Marketplace/Structs/SeqListCollectibleListingsArgs.h" #include "Util/Log.h" USequenceMarketplaceBP::USequenceMarketplaceBP() @@ -9,28 +10,357 @@ USequenceMarketplaceBP::USequenceMarketplaceBP() } -void USequenceMarketplaceBP::GetGetCollectiblesWithLowestListingsAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args) +void USequenceMarketplaceBP::GetCollectiblesWithLowestListingsFirstAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args) { - const TSuccessCallback OnSuccess = [this, ChainId, Args](const FSeqListCollectiblesReturn& CollectiblesWithLowestListings) + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqListCollectiblesReturn& CollectiblesWithLowestListings) { - this->CallCollectiblesWithLowestListingsReceived(true, ChainId, CollectiblesWithLowestListings); + this->CallCollectiblesWithLowestListingsFirstReceived(true, ChainId, CollectiblesWithLowestListings); }; const FFailureCallback OnFailure = [this, ChainId, Args](const FSequenceError& Error) { SEQ_LOG(Error, TEXT("Error getting Collectibles with Lowest Listings: %s"), *Error.Message); FSeqListCollectiblesReturn CollectiblesWithLowestListings; - this->CallCollectiblesWithLowestListingsReceived(false, ChainId, CollectiblesWithLowestListings); + this->CallCollectiblesWithLowestListingsFirstReceived(false, ChainId, CollectiblesWithLowestListings); }; this->Marketplace->ListCollectibleListingsWithLowestPriceListingsFirst(ChainId, Args.ContractAddress, Args.Filter, Args.Page, OnSuccess, OnFailure); } -void USequenceMarketplaceBP::CallCollectiblesWithLowestListingsReceived(const bool Status, const int64 ChainId, const FSeqListCollectiblesReturn& Response) +void USequenceMarketplaceBP::GetAllCollectiblesWithLowestListingsFirstAsync(const int64 ChainId, + const FSeqListCollectiblesArgs& Args) +{ + const TSuccessCallback> OnSuccess = [this, ChainId](const TArray& CollectiblesWithLowestListings) + { + this->CallAllCollectiblesWithLowestListingsFirstReceived(true, ChainId, CollectiblesWithLowestListings); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting All Collectibles with Lowest Listings First: %s"), *Error.Message); + const TArray CollectiblesWithLowestListings; + this->CallAllCollectiblesWithLowestListingsFirstReceived(false, ChainId, CollectiblesWithLowestListings); + }; + + + this->Marketplace->ListAllCollectibleListingsWithLowestPriceListingsFirst(ChainId, Args.ContractAddress, Args.Filter, OnSuccess, OnFailure); + +} + +void USequenceMarketplaceBP::GetCollectiblesWithHighestPricedOffersFirstAsync(const int64 ChainId, + const FSeqListCollectiblesArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqListCollectiblesReturn& CollectiblesWithLowestListings) + { + this->CallCollectiblesWithHighestPricedOffersFirstReceived(true, ChainId, CollectiblesWithLowestListings); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Collectibles with Highest Priced Offers First: %s"), *Error.Message); + FSeqListCollectiblesReturn CollectiblesWithHighestOffers; + this->CallCollectiblesWithHighestPricedOffersFirstReceived(false, ChainId, CollectiblesWithHighestOffers); + }; + + + this->Marketplace->ListCollectibleOffersWithHighestPricedOfferFirst(ChainId, Args.ContractAddress, Args.Filter, Args.Page, OnSuccess, OnFailure); + +} + +void USequenceMarketplaceBP::GetAllCollectiblesWithHighestPricedOffersFirstAsync(const int64 ChainId, + const FSeqListCollectiblesArgs& Args) +{ + const TSuccessCallback> OnSuccess = [this, ChainId](const TArray& CollectiblesWithHighestPricedOffers) + { + this->CallAllCollectiblesWithHighestPricedOffersFirstReceived(true, ChainId, CollectiblesWithHighestPricedOffers); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting All Collectibles with Highest Priced Offers First: %s"), *Error.Message); + const TArray CollectiblesWithHighestPricedOffers; + this->CallAllCollectiblesWithHighestPricedOffersFirstReceived(false, ChainId, CollectiblesWithHighestPricedOffers); + }; + + + this->Marketplace->ListAllCollectibleOffersWithHighestPricedOfferFirst(ChainId, Args.ContractAddress, Args.Filter, OnSuccess, OnFailure); + +} + +void USequenceMarketplaceBP::GetLowestPriceOfferForCollectibleAsync(const int64 ChainId, + const FSeqGetCollectibleOrderArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqCollectibleOrder& LowestPriceOffer) + { + this->CallLowestPriceOfferForCollectibleReceived(true, ChainId, LowestPriceOffer); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Lowest Price Offer for Collectible: %s"), *Error.Message); + FSeqCollectibleOrder LowestPriceOffer; + this->CallLowestPriceOfferForCollectibleReceived(false, ChainId, LowestPriceOffer); + }; + + this->Marketplace->GetLowestPriceOfferForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::GetHighestPriceOfferForCollectibleAsync(const int64 ChainId, + const FSeqGetCollectibleOrderArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqCollectibleOrder& HighestPriceOffer) + { + this->CallHighestPriceOfferForCollectibleReceived(true, ChainId, HighestPriceOffer); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Highest Price Offer for Collectible: %s"), *Error.Message); + FSeqCollectibleOrder HighestPriceOffer; + this->CallHighestPriceOfferForCollectibleReceived(false, ChainId, HighestPriceOffer); + }; + + this->Marketplace->GetHighestPriceOfferForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::GetLowestPriceListingForCollectibleAsync(const int64 ChainId, + const FSeqGetCollectibleOrderArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqCollectibleOrder& LowestPriceListing) + { + this->CallLowestPriceListingForCollectibleReceived(true, ChainId, LowestPriceListing); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Lowest Price Listing for Collectible: %s"), *Error.Message); + FSeqCollectibleOrder LowestPriceListing; + this->CallLowestPriceListingForCollectibleReceived(false, ChainId, LowestPriceListing); + }; + + this->Marketplace->GetLowestPriceListingForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::GetHighestPriceListingForCollectibleAsync(const int64 ChainId, + const FSeqGetCollectibleOrderArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqCollectibleOrder& HighestPriceListing) + { + this->CallHighestPriceListingForCollectibleReceived(true, ChainId, HighestPriceListing); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Highest Price Listing for Collectible: %s"), *Error.Message); + FSeqCollectibleOrder HighestPriceListing; + this->CallHighestPriceListingForCollectibleReceived(false, ChainId, HighestPriceListing); + }; + + this->Marketplace->GetHighestPriceListingForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::ListListingsForCollectibleAsync(const int64 ChainId, + const FSeqListCollectibleListingsArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqListCollectibleListingsReturn& Listings) + { + this->FOnListListingsForCollectibleResponse.Broadcast(true, ChainId, Listings); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Listings for Collectible: %s"), *Error.Message); + FSeqListCollectibleListingsReturn Listings; + this->FOnListListingsForCollectibleResponse.Broadcast(false, ChainId, Listings); + }; + + this->Marketplace->ListListingsForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, Args.Page, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::ListAllListingsForCollectibleAsync(const int64 ChainId, + const FSeqListCollectibleListingsArgs& Args) +{ + const TSuccessCallback> OnSuccess = [this, ChainId](const TArray& Listings) + { + this->CallListAllListingsForCollectibleReceived(true, ChainId, Listings); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting All Listings for Collectible: %s"), *Error.Message); + TArray Listings; + this->CallListAllListingsForCollectibleReceived(false, ChainId, Listings); + }; + + this->Marketplace->ListAllListingsForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::ListOffersForCollectibleAsync(const int64 ChainId, + const FSeqListCollectibleListingsArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqListCollectibleOffersReturn& Offers) + { + this->FOnListOffersForCollectibleResponse.Broadcast(true, ChainId, Offers); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Offers for Collectible: %s"), *Error.Message); + FSeqListCollectibleOffersReturn Offers; + this->FOnListOffersForCollectibleResponse.Broadcast(false, ChainId, Offers); + }; + + this->Marketplace->ListOffersForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, Args.Page, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::ListAllOffersForCollectibleAsync(const int64 ChainId, + const FSeqListCollectibleListingsArgs& Args) +{ + const TSuccessCallback> OnSuccess = [this, ChainId](const TArray& Offers) + { + this->FOnListAllOffersForCollectibleResponse.Broadcast(true, ChainId, Offers); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting All Offers for Collectible: %s"), *Error.Message); + TArray Offers; + this->FOnListAllOffersForCollectibleResponse.Broadcast(false, ChainId, Offers); + }; + + this->Marketplace->ListAllOffersForCollectible(ChainId, Args.ContractAddress, Args.TokenID, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::GetFloorOrderAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args) +{ + const TSuccessCallback OnSuccess = [this, ChainId](const FSeqCollectibleOrder& FloorOrder) + { + this->FOnGetFloorOrderResponse.Broadcast(true, ChainId, FloorOrder); + }; + + const FFailureCallback OnFailure = [this, ChainId](const FSequenceError& Error) + { + SEQ_LOG(Error, TEXT("Error getting Floor Order: %s"), *Error.Message); + FSeqCollectibleOrder FloorOrder; + this->FOnGetFloorOrderResponse.Broadcast(false, ChainId, FloorOrder); + }; + + this->Marketplace->GetFloorOrder(ChainId, Args.ContractAddress, Args.Filter, OnSuccess, OnFailure); +} + +void USequenceMarketplaceBP::CallCollectiblesWithLowestListingsFirstReceived(const bool Status, const int64 ChainId, const FSeqListCollectiblesReturn& Response) { if (this->CollectiblesWithLowestListingsResponse.IsBound()) this->CollectiblesWithLowestListingsResponse.Broadcast(Status, ChainId, Response); else - SEQ_LOG(Error, TEXT("Nothing bound to delegate: CollectiblesWithLowestListingsResponse")); + SEQ_LOG(Error, TEXT("Nothing bound to delegate: CollectiblesWithLowestListingsFirstResponse")); +} + +void USequenceMarketplaceBP::CallAllCollectiblesWithLowestListingsFirstReceived(const bool Status, const int64 ChainId, + const TArray& Response) +{ + if (this->AllCollectiblesWithLowestListingsResponse.IsBound()) + this->AllCollectiblesWithLowestListingsResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: AllCollectiblesWithLowestListingsFirstResponse")); +} + +void USequenceMarketplaceBP::CallCollectiblesWithHighestPricedOffersFirstReceived(const bool Status, const int64 ChainId, + const FSeqListCollectiblesReturn& Response) +{ + if (this->CollectiblesWithHighestListingsResponse.IsBound()) + this->CollectiblesWithHighestListingsResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: CollectiblesWithHighestPricedOffersFirstResponse")); +} + +void USequenceMarketplaceBP::CallAllCollectiblesWithHighestPricedOffersFirstReceived(const bool Status, + const int64 ChainId, const TArray& Response) +{ + if (this->AllCollectiblesWithHighestPricedOffersResponse.IsBound()) + this->AllCollectiblesWithHighestPricedOffersResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: AllCollectiblesWithHighestPricedOffersFirstResponse")); +} + +void USequenceMarketplaceBP::CallLowestPriceOfferForCollectibleReceived(const bool Status, const int64 ChainId, + const FSeqCollectibleOrder& Response) +{ + if (this->GetLowestPriceOfferForCollectibleResponse.IsBound()) + this->GetLowestPriceOfferForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: GetLowestPriceOfferForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallHighestPriceOfferForCollectibleReceived(const bool Status, const int64 ChainId, + const FSeqCollectibleOrder& Response) +{ + if (this->GetHighestPriceOfferForCollectibleResponse.IsBound()) + this->GetHighestPriceOfferForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: GetHighestPriceOfferForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallLowestPriceListingForCollectibleReceived(const bool Status, const int64 ChainId, + const FSeqCollectibleOrder& Response) +{ + if (this->GetLowestPriceListingForCollectibleResponse.IsBound()) + this->GetLowestPriceListingForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: GetLowestPriceListingForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallHighestPriceListingForCollectibleReceived(const bool Status, const int64 ChainId, + const FSeqCollectibleOrder& Response) +{ + if (this->GetHighestPriceListingForCollectibleResponse.IsBound()) + this->GetHighestPriceListingForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: GetHighestPriceListingForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallListListingsForCollectibleReceived(const bool Status, const int64 ChainId, + const FSeqListCollectibleListingsReturn& Response) +{ + if (this->FOnListListingsForCollectibleResponse.IsBound()) + this->FOnListListingsForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: ListListingsForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallListAllListingsForCollectibleReceived(const bool Status, const int64 ChainId, + const TArray& Response) +{ + if (this->FOnListAllListingsForCollectibleResponse.IsBound()) + this->FOnListAllListingsForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: ListAllListingsForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallListOffersForCollectibleReceived(const bool Status, const int64 ChainId, + const FSeqListCollectibleOffersReturn& Response) +{ + if (this->FOnListOffersForCollectibleResponse.IsBound()) + this->FOnListOffersForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: ListOffersForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallListAllOffersForCollectibleReceived(const bool Status, const int64 ChainId, + const TArray& Response) +{ + if (this->FOnListAllOffersForCollectibleResponse.IsBound()) + this->FOnListAllOffersForCollectibleResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: ListAllOffersForCollectibleResponse")); +} + +void USequenceMarketplaceBP::CallGetFloorOrderReceived(const bool Status, const int64 ChainId, + const FSeqCollectibleOrder& Response) +{ + if (this->FOnGetFloorOrderResponse.IsBound()) + this->FOnGetFloorOrderResponse.Broadcast(Status, ChainId, Response); + else + SEQ_LOG(Error, TEXT("Nothing bound to delegate: GetFloorOrderResponse")); } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceMarketplaceBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceMarketplaceBP.h index 9aeee6943..77ebc4469 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceMarketplaceBP.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceMarketplaceBP.h @@ -3,9 +3,22 @@ #include "CoreMinimal.h" #include "Marketplace/Marketplace.h" #include "Subsystems/GameInstanceSubsystem.h" +#include "Marketplace/Structs/SeqListCollectibleListingsArgs.h" #include "SequenceMarketplaceBP.generated.h" -DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetCollectiblesWithLowestListings, bool, Status, const int64, ChainId, FSeqListCollectiblesReturn, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetCollectiblesWithLowestListingsFirst, bool, Status, const int64, ChainId, FSeqListCollectiblesReturn, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetAllCollectiblesWithLowestListingsFirst, bool, Status, const int64, ChainId, TArray, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetCollectiblesWithHighestPricedOffersFirst, bool, Status, const int64, ChainId, FSeqListCollectiblesReturn, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetAllCollectiblesWithHighestPricedOffersFirst, bool, Status, const int64, ChainId, TArray, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetLowestPriceOfferForCollectible, bool, Status, const int64, ChainId, FSeqCollectibleOrder, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetHighestPriceOfferForCollectible, bool, Status, const int64, ChainId, FSeqCollectibleOrder, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetLowestPriceListingForCollectible, bool, Status, const int64, ChainId, FSeqCollectibleOrder, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetHighestPriceListingForCollectible, bool, Status, const int64, ChainId, FSeqCollectibleOrder, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnListListingsForCollectible, bool, Status, const int64, ChainId, FSeqListCollectibleListingsReturn, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnListAllListingsForCollectible, bool, Status, const int64, ChainId, TArray, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnListOffersForCollectible, bool, Status, const int64, ChainId, FSeqListCollectibleOffersReturn, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnListAllOffersForCollectible, bool, Status, const int64, ChainId, TArray, Response); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnGetFloorOrder, bool, Status, const int64, ChainId, FSeqCollectibleOrder, Response); UCLASS(Blueprintable) class SEQUENCEPLUGIN_API USequenceMarketplaceBP : public UGameInstanceSubsystem @@ -17,15 +30,98 @@ class SEQUENCEPLUGIN_API USequenceMarketplaceBP : public UGameInstanceSubsystem UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") - FOnGetCollectiblesWithLowestListings CollectiblesWithLowestListingsResponse; + FOnGetCollectiblesWithLowestListingsFirst CollectiblesWithLowestListingsResponse; + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetCollectiblesWithLowestListingsFirstAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetAllCollectiblesWithLowestListingsFirst AllCollectiblesWithLowestListingsResponse; UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") - void GetGetCollectiblesWithLowestListingsAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args); + void GetAllCollectiblesWithLowestListingsFirstAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args); -private: + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetCollectiblesWithHighestPricedOffersFirst CollectiblesWithHighestListingsResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetCollectiblesWithHighestPricedOffersFirstAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetAllCollectiblesWithHighestPricedOffersFirst AllCollectiblesWithHighestPricedOffersResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetAllCollectiblesWithHighestPricedOffersFirstAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetLowestPriceOfferForCollectible GetLowestPriceOfferForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetLowestPriceOfferForCollectibleAsync(const int64 ChainId, const FSeqGetCollectibleOrderArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetHighestPriceOfferForCollectible GetHighestPriceOfferForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetHighestPriceOfferForCollectibleAsync(const int64 ChainId, const FSeqGetCollectibleOrderArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetLowestPriceListingForCollectible GetLowestPriceListingForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetLowestPriceListingForCollectibleAsync(const int64 ChainId, const FSeqGetCollectibleOrderArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetHighestPriceListingForCollectible GetHighestPriceListingForCollectibleResponse; + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetHighestPriceListingForCollectibleAsync(const int64 ChainId, const FSeqGetCollectibleOrderArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnListListingsForCollectible FOnListListingsForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void ListListingsForCollectibleAsync(const int64 ChainId, const FSeqListCollectibleListingsArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnListAllListingsForCollectible FOnListAllListingsForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void ListAllListingsForCollectibleAsync(const int64 ChainId, const FSeqListCollectibleListingsArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnListOffersForCollectible FOnListOffersForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void ListOffersForCollectibleAsync(const int64 ChainId, const FSeqListCollectibleListingsArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnListAllOffersForCollectible FOnListAllOffersForCollectibleResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void ListAllOffersForCollectibleAsync(const int64 ChainId, const FSeqListCollectibleListingsArgs& Args); + + UPROPERTY(BlueprintAssignable, Category = "0xSequence SDK - Events") + FOnGetFloorOrder FOnGetFloorOrderResponse; + + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Functions") + void GetFloorOrderAsync(const int64 ChainId, const FSeqListCollectiblesArgs& Args); + + +private: UMarketplace* Marketplace; - void CallCollectiblesWithLowestListingsReceived(const bool Status, const int64 ChainId, const FSeqListCollectiblesReturn& Response); + void CallCollectiblesWithLowestListingsFirstReceived(const bool Status, const int64 ChainId, const FSeqListCollectiblesReturn& Response); + void CallAllCollectiblesWithLowestListingsFirstReceived(const bool Status, const int64 ChainId, const TArray& Response); + void CallCollectiblesWithHighestPricedOffersFirstReceived(const bool Status, const int64 ChainId, const FSeqListCollectiblesReturn& Response); + void CallAllCollectiblesWithHighestPricedOffersFirstReceived(const bool Status, const int64 ChainId, const TArray& Response); + void CallLowestPriceOfferForCollectibleReceived(const bool Status, const int64 ChainId, const FSeqCollectibleOrder& Response); + void CallHighestPriceOfferForCollectibleReceived(const bool Status, const int64 ChainId, const FSeqCollectibleOrder& Response); + void CallLowestPriceListingForCollectibleReceived(const bool Status, const int64 ChainId, const FSeqCollectibleOrder& Response); + void CallHighestPriceListingForCollectibleReceived(const bool Status, const int64 ChainId, const FSeqCollectibleOrder& Response); + void CallListListingsForCollectibleReceived(const bool Status, const int64 ChainId, const FSeqListCollectibleListingsReturn& Response); + void CallListAllListingsForCollectibleReceived(const bool Status, const int64 ChainId, const TArray& Response); + void CallListOffersForCollectibleReceived(const bool Status, const int64 ChainId, const FSeqListCollectibleOffersReturn& Response); + void CallListAllOffersForCollectibleReceived(const bool Status, const int64 ChainId, const TArray& Response); + void CallGetFloorOrderReceived(const bool Status, const int64 ChainId, const FSeqCollectibleOrder& Response); }; \ No newline at end of file From 2be835f1e457f11e0368500c7ebf83b3da852f1a Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Mon, 10 Feb 2025 10:05:32 -0500 Subject: [PATCH 03/48] All method implementations for Checkout done again in a working and more organized format --- .../Private/Checkout/Checkout.cpp | 168 ++++++++++++++++++ .../Private/Checkout/Checkout.h | 34 ++++ .../Public/Checkout/Enums/StepType.h | 14 ++ .../Public/Checkout/Structs/AdditionalFee.h | 35 ++++ .../Public/Checkout/Structs/CreateReq.h | 59 ++++++ .../Public/Checkout/Structs/Domain.h | 56 ++++++ .../Checkout/Structs/GenerateBuyTransaction.h | 97 ++++++++++ .../GenerateCancelTransactionRequest.h | 47 +++++ .../Structs/GenerateListingTransactionArgs.h | 58 ++++++ .../Structs/GenerateOfferTransactionArgs.h | 58 ++++++ .../Structs/GenerateSellTransaction.h | 97 ++++++++++ .../Structs/GenerateTransactionResponse.h | 71 ++++++++ .../Public/Checkout/Structs/OrderData.h | 38 ++++ .../Public/Checkout/Structs/PostRequest.h | 49 +++++ .../Checkout/Structs/TransactionSignature.h | 64 +++++++ .../Public/Checkout/Structs/TransactionStep.h | 84 +++++++++ .../Public/Marketplace/Marketplace_Enums.h | 13 ++ .../Public/Sequence/Wallet_Enums.h | 31 ++++ 18 files changed, 1073 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp new file mode 100644 index 000000000..35702542d --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp @@ -0,0 +1,168 @@ +#include "Checkout.h" + +#include "Checkout/Structs/GenerateBuyTransaction.h" +#include "Checkout/Structs/GenerateCancelTransactionRequest.h" +#include "Checkout/Structs/GenerateListingTransactionArgs.h" +#include "Checkout/Structs/GenerateOfferTransactionArgs.h" +#include "Checkout/Structs/GenerateSellTransaction.h" +#include "Checkout/Structs/OrderData.h" + +UCheckout::UCheckout(): ChainID() +{; + this->ChainID = 0; +} + +UCheckout::UCheckout(UMarketplace* Marketplace, USequenceWallet* InWallet, const int64& InChainID): + ChainID() +{ + this->Marketplace = Marketplace; + this->Wallet = InWallet; + this->ChainID = InChainID; +} + +template < typename T> FString UCheckout::BuildArgs(T StructIn) const +{ + FString Result = "[FAILED TO PARSE]"; + if (StructIn.customGetter) + { + Result = StructIn.GetArgs(); + } + else + { + if (!FJsonObjectConverter::UStructToJsonObjectString(StructIn, Result)) + { + UE_LOG(LogTemp, Display, TEXT("Failed to convert specified UStruct to a json object\n")); + } + } + return Result; +} + + +template T UCheckout::BuildResponse(const FString Text) const +{ + //Take the FString and convert it to a JSON object first! + TSharedPtr JSON_Step; + //Then take the json object we make and convert it to a USTRUCT of type T then we return that! + T Ret_Struct; + + if (!FJsonSerializer::Deserialize(TJsonReaderFactory<>::Create(Text), JSON_Step)) + { + UE_LOG(LogTemp, Display, TEXT("Failed to convert String: %s to Json object"), *Text); + return T(); + } + //this next line with throw an exception in null is used as an entry in json attributes! we need to remove null entries + if (Ret_Struct.customConstructor) + {//use the custom constructor! + Ret_Struct.Construct(*JSON_Step.Get()); + } + else + {//use unreal parsing! + if (!FJsonObjectConverter::JsonObjectToUStruct(JSON_Step.ToSharedRef(), &Ret_Struct)) + { + UE_LOG(LogTemp, Display, TEXT("Failed to convert Json Object: %s to USTRUCT of type T"), *Text); + return T(); + } + } + Ret_Struct.Setup(*JSON_Step.Get());//now for the edge cases we will manually inject the data where it needs to be! + return Ret_Struct; +} + +void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const +{ + TArray OrdersData; + OrdersData.Reserve(1); + OrdersData.Add(FOrderData(Order.OrderId, FString::Printf(TEXT("%lld"), Amount))); + + const TArray AdditionalFees { AdditionalFee }; + + const FString Endpoint = "GenerateBuyTransaction"; + const FString Args = BuildArgs(FGenerateBuyTransaction{ Order.CollectionContractAddress, Wallet->GetWalletAddress(), Order.Marketplace, OrdersData, AdditionalFees, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) }); + + Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + +void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const +{ + TArray OrdersData; + OrdersData.Reserve(1); + OrdersData.Add(FOrderData(Order.OrderId, FString::Printf(TEXT("%lld"), Amount))); + + const TArray AdditionalFees { AdditionalFee }; + + const FString Endpoint = "GenerateSellTransaction"; + const FString Args = BuildArgs(FGenerateSellTransaction{ Order.CollectionContractAddress, Wallet->GetWalletAddress(), Order.Marketplace, OrdersData, AdditionalFees, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) });; + + Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + +void UCheckout::GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, + const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const +{ + int64 EpochTime = Expiry.ToUnixTimestamp(); + const FString Endpoint = "GenerateListingTransaction"; + const FString Args = BuildArgs(FGenerateListingTransactionArgs { + CollectionAddress, Wallet->GetWalletAddress(), ContractType, OrderbookKind, FCreateReq { + TokenId, FString::Printf(TEXT("%lld"), Amount), FString::Printf(TEXT("%lld"), EpochTime), CurrencyTokenAddress, FString::Printf(TEXT("%lld"), PricePerToken) + }, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) + }); + + Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + +void UCheckout::GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, const int64 Amount, + const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, + const EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) const +{ + int64 EpochTime = Expiry.ToUnixTimestamp(); + const FString Endpoint = "GenerateOfferTransaction"; + const FString Args = BuildArgs(FGenerateOfferTransactionArgs { + CollectionAddress, Wallet->GetWalletAddress(), ContractType, OrderbookKind, FCreateReq { + TokenId, FString::Printf(TEXT("%lld"), Amount), FString::Printf(TEXT("%lld"), EpochTime), CurrencyTokenAddress, FString::Printf(TEXT("%lld"), PricePerToken) + }, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) + }); + + Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + +void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, + const EMarketplaceKind MarketplaceKind, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) const +{ + const FString Endpoint = "GenerateCancelTransaction"; + const FString Args = BuildArgs(FGenerateCancelTransactionRequest { + CollectionAddress, Wallet->GetWalletAddress(), MarketplaceKind, OrderId + }); + + Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + +void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, const FSeqOrder& Order, + const EMarketplaceKind MarketplaceKind, const TSuccessCallback& OnSuccess, + const FFailureCallback& OnFailure) const +{ + GenerateCancelTransaction(CollectionAddress, Order.OrderId, MarketplaceKind, OnSuccess, OnFailure); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h new file mode 100644 index 000000000..bb55ee60d --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h @@ -0,0 +1,34 @@ +#pragma once +#include "Checkout/Structs/AdditionalFee.h" +#include "Checkout/Structs/GenerateTransactionResponse.h" +#include "Marketplace/Marketplace.h" +#include "Sequence/SequenceAPI.h" + +#include "Checkout.generated.h" + +UCLASS() +class SEQUENCEPLUGIN_API UCheckout : public UObject +{ + GENERATED_BODY() + +private: + UMarketplace* Marketplace = nullptr; + USequenceWallet* Wallet = nullptr; + int64 ChainID; + +public: + // Constructor + UCheckout(); + UCheckout(UMarketplace* Marketplace, USequenceWallet* InWallet, const int64& InChainID); + + template < typename T> FString BuildArgs(T StructIn) const; + + template < typename T > T BuildResponse(FString Text) const; + + void GenerateBuyTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; + void GenerateSellTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; + void GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; + void GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; + void GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; + void GenerateCancelTransaction(const FString& CollectionAddress, const FSeqOrder& Order, EMarketplaceKind MarketplaceKind, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h new file mode 100644 index 000000000..2febd44ab --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h @@ -0,0 +1,14 @@ +#pragma once + +UENUM(Blueprintable) +enum class EStepType : uint8 +{ + Unknown UMETA(DisplayName = "unknown"), + TokenApproval UMETA(DisplayName = "tokenApproval"), + Buy UMETA(DisplayName = "buy"), + Sell UMETA(DisplayName = "sell"), + CreateListing UMETA(DisplayName = "createListing"), + CreateOffer UMETA(DisplayName = "createOffer"), + SignEip712 UMETA(DisplayName = "signEIP712"), + SignEip191 UMETA(DisplayName = "signEIP191"), +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h new file mode 100644 index 000000000..c51e14cc6 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h @@ -0,0 +1,35 @@ +#pragma once + +#include "AdditionalFee.Generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FAdditionalFee +{ + GENERATED_USTRUCT_BODY() +public: + FString Amount; + FString Receiver; + + FAdditionalFee() + { + } + + FAdditionalFee(FString Amount, FString Receiver) + { + this->Amount = Amount; + this->Receiver = Receiver; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"amount\":\"" + Amount + "\","; + ReturnArgs += "\"receiver\":\"" + Receiver + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h new file mode 100644 index 000000000..e6f2c6c6e --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h @@ -0,0 +1,59 @@ +#pragma once + +#include "CreateReq.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FCreateReq +{ + GENERATED_USTRUCT_BODY() + +public: + FString TokenId; + FString Quantity; + FString Expiry; + FString CurrencyAddress; + FString PricePerToken; + + FCreateReq() + { + this->TokenId = ""; + this->Quantity = ""; + this->Expiry = ""; + this->CurrencyAddress = ""; + this->PricePerToken = ""; + } + + FCreateReq(FString TokenId, FString Quantity, FString Expiry, FString CurrencyAddress, FString PricePerToken) + { + this->TokenId = TokenId; + this->Quantity = Quantity; + this->Expiry = Expiry; + this->CurrencyAddress = CurrencyAddress; + this->PricePerToken = PricePerToken; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"tokenId\":\"" + TokenId + "\","; + ReturnArgs += "\"quantity\":\"" + Quantity + "\","; + ReturnArgs += "\"expiry\":\"" + Expiry + "\","; + ReturnArgs += "\"currencyAddress\":\"" + CurrencyAddress + "\","; + ReturnArgs += "\"pricePerToken\":\"" + PricePerToken + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } + + void Setup(FJsonObject& JSON_In) + { + TokenId = JSON_In.GetStringField(TEXT("tokenId")); + Quantity = JSON_In.GetStringField(TEXT("quantity")); + Expiry = JSON_In.GetStringField(TEXT("expiry")); + CurrencyAddress = JSON_In.GetStringField(TEXT("currencyAddress")); + PricePerToken = JSON_In.GetStringField(TEXT("pricePerToken")); + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h new file mode 100644 index 000000000..ec440446e --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h @@ -0,0 +1,56 @@ +#pragma once + +#include "Domain.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FDomain +{ + GENERATED_USTRUCT_BODY() + +public: + FString Name; + FString Version; + uint64 ChainId; + // Chain enum? + FString VerifyingContract; + + FDomain() + { + this->Name = ""; + this->Version = ""; + this->ChainId = 0; + this->VerifyingContract = ""; + } + + FDomain(FString Name, FString Version, const uint64 ChainId, FString VerifyingContract) + { + this->Name = Name; + this->Version = Version; + this->ChainId = ChainId; + this->VerifyingContract = VerifyingContract; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"name\":\"" + Name + "\","; + ReturnArgs += "\"version\":\"" + Version + "\","; + ReturnArgs += "\"chainId\":\"" + FString::Printf(TEXT("%lld"), ChainId) + "\","; + ReturnArgs += "\"verifyingContract\":\"" + VerifyingContract + "\""; + + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } + + void Setup(FJsonObject& JSON_In) + { + Name = JSON_In.GetStringField(TEXT("name")); + Version = JSON_In.GetStringField(TEXT("version")); + ChainId = JSON_In.GetIntegerField(TEXT("chainId")); + VerifyingContract = JSON_In.GetStringField(TEXT("verifyingContract")); + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h new file mode 100644 index 000000000..62050c911 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h @@ -0,0 +1,97 @@ +#pragma once +#include "AdditionalFee.h" +#include "OrderData.h" +#include "Marketplace/Marketplace_Enums.h" +#include "Sequence/Wallet_Enums.h" + +#include "GenerateBuyTransaction.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGenerateBuyTransaction +{ + GENERATED_USTRUCT_BODY() + +private: + FString GetOrdersDataArgs() const + { + FString OrdersDataArgs = ""; + + for (uint16 i = 0; i < OrdersData.Num(); i++) + { + if (i < OrdersData.Num() - 1) + { + OrdersDataArgs += OrdersData[i].GetArgs() + ","; + } + else + { + OrdersDataArgs += OrdersData[i].GetArgs(); + } + } + + return OrdersDataArgs; + } + + FString GetAdditionalFeesArgs() const + { + FString AdditionalFeesArgs = ""; + + for (uint16 i = 0; i < AdditionalFees.Num(); i++) + { + if (i < OrdersData.Num() - 1) + { + AdditionalFeesArgs += AdditionalFees[i].GetArgs() + ","; + } + else + { + AdditionalFeesArgs += AdditionalFees[i].GetArgs(); + } + } + + return AdditionalFeesArgs; + } + +public: + FString CollectionAddress; + FString Buyer; + EMarketplaceKind Marketplace; + TArray OrdersData; + TArray AdditionalFees; + EWalletKind WalletType; + + FGenerateBuyTransaction() + { + this->CollectionAddress = ""; + this->Buyer = ""; + this->Marketplace = SEQUENCE_MARKETPLACE_V2; + this->OrdersData = TArray(); + this->AdditionalFees = TArray(); + this->WalletType = EWalletKind::Unknown; + } + + FGenerateBuyTransaction(FString CollectionAddress, FString Buyer, const EMarketplaceKind Marketplace, const TArray& OrdersData, const TArray& AdditionalFees, const EWalletKind WalletType) + { + this->CollectionAddress = CollectionAddress; + this->Buyer = Buyer; + this->Marketplace = Marketplace; + this->OrdersData = OrdersData; + this->AdditionalFees = AdditionalFees; + this->WalletType = WalletType; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"collectionAddress\":\"" + CollectionAddress + "\","; + ReturnArgs += "\"buyer\":\"" + Buyer + "\","; + ReturnArgs += "\"marketplace\":\"" + UEnum::GetValueAsString(Marketplace) + "\","; + ReturnArgs += "\"OrdersData\":[" + GetOrdersDataArgs() + "],"; + ReturnArgs += "\"AdditionalFees\":[" + GetAdditionalFeesArgs() + "],"; + ReturnArgs += "\"WalletType\":\"" + UEnum::GetValueAsString(WalletType) + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h new file mode 100644 index 000000000..b39fc4ca3 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h @@ -0,0 +1,47 @@ +#pragma once +#include "Marketplace/Marketplace_Enums.h" + +#include "GenerateCancelTransactionRequest.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGenerateCancelTransactionRequest +{ + GENERATED_USTRUCT_BODY() + +public: + FString CollectionAddress; + FString Maker; + EMarketplaceKind Marketplace; + FString OrderId; + + FGenerateCancelTransactionRequest() + { + this->CollectionAddress = ""; + this->Maker = ""; + this->Marketplace = EMarketplaceKind::UNKNOWN_MK; + this->OrderId = ""; + } + + FGenerateCancelTransactionRequest(FString CollectionAddress, FString Maker, EMarketplaceKind Marketplace, FString OrderId) + { + this->CollectionAddress = CollectionAddress; + this->Maker = Maker; + this->Marketplace = Marketplace; + this->OrderId = OrderId; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"collectionAddress\":\"" + CollectionAddress + "\","; + ReturnArgs += "\"maker\":\"" + Maker + "\","; + ReturnArgs += "\"marketplace\":\"" + UEnum::GetValueAsString(Marketplace) + "\","; + ReturnArgs += "\"orderId\":\"" + OrderId + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h new file mode 100644 index 000000000..a3d16c2b9 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h @@ -0,0 +1,58 @@ +#pragma once +#include "CreateReq.h" +#include "Indexer/Indexer_Enums.h" +#include "Marketplace/Marketplace_Enums.h" +#include "Sequence/Wallet_Enums.h" + +#include "GenerateListingTransactionArgs.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGenerateListingTransactionArgs +{ + GENERATED_USTRUCT_BODY() + +public: + FString CollectionAddress; + FString Owner; + EContractType ContractType; + EOrderbookKind Orderbook; + FCreateReq Listing; + EWalletKind WalletType; + + FGenerateListingTransactionArgs() + { + this->CollectionAddress = ""; + this->Owner = ""; + this->ContractType = EContractType::UNKOWN_CT; + this->Orderbook = EOrderbookKind::Unknown; + this->Listing = FCreateReq(); + this->WalletType = EWalletKind::Sequence; + } + + FGenerateListingTransactionArgs(FString CollectionAddress, FString Owner, EContractType ContractType, EOrderbookKind OrderbookKind, FCreateReq Listing, EWalletKind WalletType) + { + this->CollectionAddress = CollectionAddress; + this->Owner = Owner; + this->ContractType = ContractType; + this->Orderbook = Orderbook; + this->Listing = Listing; + this->WalletType = WalletType; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"collectionAddress\":\"" + CollectionAddress + "\","; + ReturnArgs += "\"owner\":\"" + Owner + "\","; + ReturnArgs += "\"contractType\":\"" + UEnum::GetValueAsString(ContractType) + "\","; + ReturnArgs += "\"orderbook\":\"" + UEnum::GetValueAsString(Orderbook) + "\","; + ReturnArgs += "\"listing\":\"" + Listing.GetArgs() + "\","; + ReturnArgs += "\"WalletType\":\"" + UEnum::GetValueAsString(WalletType) + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h new file mode 100644 index 000000000..08696f51a --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h @@ -0,0 +1,58 @@ +#pragma once +#include "CreateReq.h" +#include "Indexer/Indexer_Enums.h" +#include "Marketplace/Marketplace_Enums.h" +#include "Sequence/Wallet_Enums.h" + +#include "GenerateOfferTransactionArgs.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGenerateOfferTransactionArgs +{ + GENERATED_USTRUCT_BODY() + +public: + FString CollectionAddress; + FString Maker; + EContractType ContractType; + EOrderbookKind Orderbook; + FCreateReq Offer; + EWalletKind WalletType; + + FGenerateOfferTransactionArgs() + { + this->CollectionAddress = ""; + this->Maker = ""; + this->ContractType = EContractType::UNKOWN_CT; + this->Orderbook = EOrderbookKind::Unknown; + this->Offer = FCreateReq(); + this->WalletType = EWalletKind::Sequence; + } + + FGenerateOfferTransactionArgs(FString CollectionAddress, FString Maker, const EContractType ContractType, const EOrderbookKind Orderbook, const FCreateReq& Offer, const EWalletKind WalletType) + { + this->CollectionAddress = CollectionAddress; + this->Maker = Maker; + this->ContractType = ContractType; + this->Orderbook = Orderbook; + this->Offer = Offer; + this->WalletType = WalletType; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"collectionAddress\":\"" + CollectionAddress + "\","; + ReturnArgs += "\"maker\":\"" + Maker + "\","; + ReturnArgs += "\"contractType\":\"" + UEnum::GetValueAsString(ContractType) + "\","; + ReturnArgs += "\"orderbook\":\"" + UEnum::GetValueAsString(Orderbook) + "\","; + ReturnArgs += "\"offer\":\"" + Offer.GetArgs() + "\","; + ReturnArgs += "\"WalletType\":\"" + UEnum::GetValueAsString(WalletType) + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h new file mode 100644 index 000000000..708638bef --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h @@ -0,0 +1,97 @@ +#pragma once +#include "AdditionalFee.h" +#include "OrderData.h" +#include "Marketplace/Marketplace_Enums.h" +#include "Sequence/Wallet_Enums.h" + +#include "GenerateSellTransaction.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGenerateSellTransaction +{ + GENERATED_USTRUCT_BODY() + +private: + FString GetOrdersDataArgs() const + { + FString OrdersDataArgs = ""; + + for (uint16 i = 0; i < OrdersData.Num(); i++) + { + if (i < OrdersData.Num() - 1) + { + OrdersDataArgs += OrdersData[i].GetArgs() + ","; + } + else + { + OrdersDataArgs += OrdersData[i].GetArgs(); + } + } + + return OrdersDataArgs; + } + + FString GetAdditionalFeesArgs() const + { + FString AdditionalFeesArgs = ""; + + for (uint16 i = 0; i < AdditionalFees.Num(); i++) + { + if (i < OrdersData.Num() - 1) + { + AdditionalFeesArgs += AdditionalFees[i].GetArgs() + ","; + } + else + { + AdditionalFeesArgs += AdditionalFees[i].GetArgs(); + } + } + + return AdditionalFeesArgs; + } + +public: + FString CollectionAddress; + FString Seller; + EMarketplaceKind Marketplace; + TArray OrdersData; + TArray AdditionalFees; + EWalletKind WalletType; + + FGenerateSellTransaction() + { + this->CollectionAddress = ""; + this->Seller = ""; + this->Marketplace = SEQUENCE_MARKETPLACE_V2; + this->OrdersData = TArray(); + this->AdditionalFees = TArray(); + this->WalletType = EWalletKind::Unknown; + } + + FGenerateSellTransaction(FString CollectionAddress, FString Seller, const EMarketplaceKind Marketplace, const TArray& OrdersData, const TArray& AdditionalFees, const EWalletKind WalletType) + { + this->CollectionAddress = CollectionAddress; + this->Seller = Seller; + this->Marketplace = Marketplace; + this->OrdersData = OrdersData; + this->AdditionalFees = AdditionalFees; + this->WalletType = WalletType; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"collectionAddress\":\"" + CollectionAddress + "\","; + ReturnArgs += "\"seller\":\"" + Seller + "\","; + ReturnArgs += "\"marketplace\":\"" + UEnum::GetValueAsString(Marketplace) + "\","; + ReturnArgs += "\"OrdersData\":[" + GetOrdersDataArgs() + "],"; + ReturnArgs += "\"AdditionalFees\":[" + GetAdditionalFeesArgs() + "],"; + ReturnArgs += "\"WalletType\":\"" + UEnum::GetValueAsString(WalletType) + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h new file mode 100644 index 000000000..af2d55fa6 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h @@ -0,0 +1,71 @@ +#pragma once +#include "TransactionStep.h" +#include "Util/SequenceSupport.h" + +#include "GenerateTransactionResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGenerateTransactionResponse +{ + GENERATED_USTRUCT_BODY() + +private: + FString GetEachStepArg() + { + FString StepArgs = ""; + + for (uint16 StepIndex = 0; StepIndex < Steps.Num(); StepIndex++) + { + if (StepIndex < Steps.Num() - 1) + { + StepArgs += Steps[StepIndex].GetArgs() + ","; + } + else + { + StepArgs += Steps[StepIndex].GetArgs(); + } + } + + return StepArgs; + } + + +public: + TArray Steps; + + FGenerateTransactionResponse() + { + this->Steps = TArray(); + } + + FGenerateTransactionResponse(const TArray& Steps) + { + this->Steps = Steps; + } + + bool customConstructor = false; + + void Construct(FJsonObject JSON_In) + { + } + + void Setup(const FJsonObject& JSON_In) + { + if (JSON_In.HasField(TEXT("steps"))) + { + const TArray>& StepsArray = JSON_In.GetArrayField(TEXT("steps")); + Steps.Empty(); + for (int32 i = 0; i < StepsArray.Num(); ++i) + { + TSharedPtr StepValue = StepsArray[i]; + if (StepValue->Type == EJson::Object) + { + FTransactionStep Step; + TSharedPtr StepJsonObject = USequenceSupport::JsonStringToObject(StepValue->AsString()); + Step.Setup(*StepJsonObject); + Steps.Add(Step); + } + } + } + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h new file mode 100644 index 000000000..22418f6be --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h @@ -0,0 +1,38 @@ +#pragma once + +#include "OrderData.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FOrderData +{ + GENERATED_USTRUCT_BODY() + +public: + FString OrderId; + FString Quantity; + + FOrderData() + { + OrderId = ""; + Quantity = ""; + } + + FOrderData(FString OrderId, FString Quantity) + { + this->OrderId = OrderId; + this->Quantity = Quantity; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"orderId\":\"" + OrderId + "\","; + ReturnArgs += "\"quantity\":\"" + Quantity + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h new file mode 100644 index 000000000..ff03055b4 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h @@ -0,0 +1,49 @@ +#pragma once + +#include "PostRequest.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FPostRequest +{ + GENERATED_USTRUCT_BODY() + +public: + FString EndPoint; + FString Method; + FString Body; + + FPostRequest() + { + EndPoint = ""; + Method = ""; + Body = ""; + } + + FPostRequest(FString EndPoint, FString Method, FString Body) + { + this->EndPoint = EndPoint; + this->Method = Method; + this->Body = Body; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"endPoint\":\"" + EndPoint + "\","; + ReturnArgs += "\"method\":\"" + Method + "\","; + ReturnArgs += "\"body\":\"" + Body + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } + + void Setup(FJsonObject& JSON_In) + { + EndPoint = JSON_In.GetStringField(TEXT("endPoint")); + Method = JSON_In.GetStringField(TEXT("method")); + Body = JSON_In.GetStringField(TEXT("body")); + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h new file mode 100644 index 000000000..2b2e68175 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h @@ -0,0 +1,64 @@ +#pragma once +#include "Domain.h" +#include "Util/SequenceSupport.h" + +#include "TransactionSignature.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FTransactionSignature +{ + GENERATED_USTRUCT_BODY() + +public: + FDomain Domain; + FString Types; + FString PrimaryType; + FString Value; + + FTransactionSignature() + { + Domain = FDomain(); + Types = ""; + PrimaryType = ""; + Value = ""; + } + + FTransactionSignature(const FDomain& Domain, FString Types, FString PrimaryType, FString Value) + { + this->Domain = Domain; + this->Types = Types; + this->PrimaryType = PrimaryType; + this->Value = Value; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"domain\":\"" + Domain.GetArgs() + "\","; + ReturnArgs += "\"types\":\"" + Types + "\","; + ReturnArgs += "\"primaryType\":\"" + PrimaryType + "\","; + ReturnArgs += "\"value\":\"" + Value + "\""; + + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } + + void Setup(FJsonObject& JSON_In) + { + // Setup Domain + if (JSON_In.TryGetField(TEXT("domain"))) + { + const TSharedPtr DomainValue = JSON_In.GetField(TEXT("domain"), EJson::Object); + const TSharedPtr DomainJsonObject = USequenceSupport::JsonStringToObject(DomainValue->AsString()); + Domain.Setup(*DomainJsonObject); + } + + Types = JSON_In.GetStringField(TEXT("types")); + PrimaryType = JSON_In.GetStringField(TEXT("primaryType")); + Value = JSON_In.GetStringField(TEXT("value")); + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h new file mode 100644 index 000000000..2a4dfc59f --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h @@ -0,0 +1,84 @@ +#pragma once +#include "PostRequest.h" +#include "TransactionSignature.h" +#include "Checkout/Enums/StepType.h" +#include "Util/SequenceSupport.h" + +#include "TransactionStep.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FTransactionStep +{ + GENERATED_USTRUCT_BODY() + +public: + EStepType Id; + FString Data; + FString To; + FString Value; + FTransactionSignature Signature; + FPostRequest Post; + + FTransactionStep() + { + this->Id = EStepType::Unknown; + this->Data = ""; + this->To = ""; + this->Value = ""; + this->Signature = FTransactionSignature(); + this->Post = FPostRequest(); + } + + FTransactionStep(const EStepType Id, FString Data, FString To, FString Value, const FTransactionSignature& Signature, const FPostRequest& Post) + { + this->Id = Id; + this->Data = Data; + this->To = To; + this->Value = Value; + this->Signature = Signature; + this->Post = Post; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"id\":\"" + UEnum::GetValueAsString(Id) + "\","; + ReturnArgs += "\"data\":\"" + Data + "\","; + ReturnArgs += "\"to\":\"" + To + "\","; + ReturnArgs += "\"value\":\"" + Value + "\","; + ReturnArgs += "\"signature\":\"" + Signature.GetArgs() + "\","; + ReturnArgs += "\"post\":\"" + Post.GetArgs() + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } + + void Setup(FJsonObject& JSON_In) + { + if (JSON_In.TryGetField(TEXT("id"))) + { + Id = static_cast(JSON_In.GetIntegerField(TEXT("id"))); + } + + Data = JSON_In.GetStringField(TEXT("data")); + To = JSON_In.GetStringField(TEXT("to")); + Value = JSON_In.GetStringField(TEXT("value")); + // Setup Signature + if (JSON_In.TryGetField(TEXT("signature"))) + { + const TSharedPtr SignatureValue = JSON_In.GetField(TEXT("signature"), EJson::Object); + TSharedPtr SignatureJsonObject = USequenceSupport::JsonStringToObject(SignatureValue->AsString()); + Signature.Setup(*SignatureJsonObject); + } + // Setup Post Request + if (JSON_In.TryGetField(TEXT("post"))) + { + const TSharedPtr PostRequestValue = JSON_In.GetField(TEXT("post"), EJson::Object); + const TSharedPtr PostRequestJsonObject = USequenceSupport::JsonStringToObject(PostRequestValue->AsString()); + Post.Setup(*PostRequestJsonObject); + } + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h index e0595f5ac..f660a04a5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h @@ -67,6 +67,19 @@ enum EOrderStatus FILLED UMETA(DisplayName = "Filled"), }; +UENUM(BlueprintType) +enum class EOrderbookKind : uint8 +{ + Unknown UMETA(DisplayName = "unknown"), + Sequence_Marketplace_V1 UMETA(DisplayName = "sequence_marketplace_v1"), + Sequence_Marketplace_V2 UMETA(DisplayName = "sequence_marketplace_v2"), + Blur UMETA(DisplayName = "blur"), + Opensea UMETA(DisplayName = "opensea"), + Looks_Rare UMETA(DisplayName = "looks_rare"), + Reservoir UMETA(DisplayName = "reservoir"), + X2Y2 UMETA(DisplayName = "x2y2") +}; + // PropertyType Extensions UCLASS() diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h new file mode 100644 index 000000000..0bfa3ecc2 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h @@ -0,0 +1,31 @@ +#pragma once +#include "SequenceAPI.h" + +#include "Wallet_Enums.generated.h" + +UENUM(BlueprintType) +enum class EWalletKind : uint8 +{ + Unknown UMETA(DisplayName = "unknown"), + Sequence UMETA(DisplayName = "sequence") +}; + +// PropertyType Extensions +UCLASS() +class UMarketplaceWalletKindExtensions : public UObject +{ + GENERATED_BODY() + +public: + template + static EWalletKind GetWalletKind(WalletType) + { + if (std::is_same_v) + { + return EWalletKind::Sequence; + } + + return EWalletKind::Unknown; + } + +}; From 3026e1d294b38619a9eab224deff8ee2d5740afe Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Mon, 10 Feb 2025 17:24:37 -0500 Subject: [PATCH 04/48] ReAdded GetCheckoutOptions methods --- .../Private/Checkout/Checkout.cpp | 30 ++++++++- .../Private/Checkout/Checkout.h | 6 +- .../Public/Checkout/Enums/CheckoutOptions.h | 11 ++++ .../Structs/CheckoutOptionsMarketplaceOrder.h | 43 +++++++++++++ .../Checkout/Structs/GetCheckoutOptionsArgs.h | 63 +++++++++++++++++++ .../Structs/GetCheckoutOptionsResponse.h | 37 +++++++++++ 6 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/CheckoutOptions.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp index 35702542d..6de6ff189 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp @@ -5,6 +5,8 @@ #include "Checkout/Structs/GenerateListingTransactionArgs.h" #include "Checkout/Structs/GenerateOfferTransactionArgs.h" #include "Checkout/Structs/GenerateSellTransaction.h" +#include "Checkout/Structs/GetCheckoutOptionsArgs.h" +#include "Checkout/Structs/GetCheckoutOptionsResponse.h" #include "Checkout/Structs/OrderData.h" UCheckout::UCheckout(): ChainID() @@ -67,8 +69,34 @@ template T UCheckout::BuildResponse(const FString Text) const return Ret_Struct; } +void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 AdditionalFeeBps, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const +{ + const FString Endpoint = "CheckoutOptionsMarketplace"; + const FString Args = BuildArgs(FGetCheckoutOptionsArgs { Wallet->GetWalletAddress(), Orders, AdditionalFeeBps }); + + Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGetCheckoutOptionsResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + +void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 AdditionalFeeBps, + const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + TArray Options; + Options.Reserve(Orders.Num()); + for (int32 i = 0; i < Orders.Num(); i++) + { + Options[i] = FCheckoutOptionsMarketplaceOrder(Orders[i].CollectionContractAddress, Orders[i].OrderId, Orders[i].Marketplace); + } + + GetCheckoutOptions(Options, AdditionalFeeBps, OnSuccess, OnFailure); +} + void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const { TArray OrdersData; OrdersData.Reserve(1); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h index bb55ee60d..1ac1dedec 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h @@ -1,6 +1,8 @@ #pragma once #include "Checkout/Structs/AdditionalFee.h" +#include "Checkout/Structs/CheckoutOptionsMarketplaceOrder.h" #include "Checkout/Structs/GenerateTransactionResponse.h" +#include "Checkout/Structs/GetCheckoutOptionsResponse.h" #include "Marketplace/Marketplace.h" #include "Sequence/SequenceAPI.h" @@ -24,7 +26,9 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject template < typename T> FString BuildArgs(T StructIn) const; template < typename T > T BuildResponse(FString Text) const; - + + void GetCheckoutOptions(const TArray& Orders, int64 AdditionalFeeBps, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; + void GetCheckoutOptions(const TArray& Orders, int64 AdditionalFeeBps, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; void GenerateBuyTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; void GenerateSellTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; void GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/CheckoutOptions.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/CheckoutOptions.h new file mode 100644 index 000000000..b189d8913 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/CheckoutOptions.h @@ -0,0 +1,11 @@ +#pragma once + +UENUM(Blueprintable) +enum class ECheckoutOptions : uint8 +{ + CryptoPurchase UMETA(DisplayName = "CryptoPurchase"), + SwapAndPay UMETA(DisplayName = "SwapAndPay"), + SardineCheckout UMETA(DisplayName = "SardineCheckout"), + TransferFundsViaQR UMETA(DisplayName = "TransferFundsViaQR"), + TransakOnramp UMETA(DisplayName = "TransakOnramp") +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h new file mode 100644 index 000000000..afd6be715 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h @@ -0,0 +1,43 @@ +#pragma once +#include "Marketplace/Marketplace_Enums.h" + +#include "CheckoutOptionsMarketplaceOrder.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FCheckoutOptionsMarketplaceOrder +{ + GENERATED_USTRUCT_BODY() + +public: + FString ContractAddress; + FString OrderId; + EMarketplaceKind Marketplace; + + FCheckoutOptionsMarketplaceOrder() + { + this->ContractAddress = ""; + this->OrderId = ""; + this->Marketplace = EMarketplaceKind::UNKNOWN_MK; + } + + FCheckoutOptionsMarketplaceOrder(FString ContractAddress, FString OrderId, const EMarketplaceKind Marketplace) + { + this->ContractAddress = ContractAddress; + this->OrderId = OrderId; + this->Marketplace = Marketplace; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"contractAddress\":\"" + ContractAddress + "\","; + ReturnArgs += "\"orderId\":\"" + OrderId + "\","; + ReturnArgs += "\"marketplace\":\"" + UEnum::GetValueAsString(Marketplace) + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h new file mode 100644 index 000000000..81d5f4a74 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h @@ -0,0 +1,63 @@ +#pragma once +#include "CheckoutOptionsMarketplaceOrder.h" + +#include "GetCheckoutOptionsArgs.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGetCheckoutOptionsArgs +{ + GENERATED_USTRUCT_BODY() + +private: + FString GetOrdersDataArgs() const + { + FString OrdersDataArgs = ""; + + for (uint16 i = 0; i < Orders.Num(); i++) + { + if (i < Orders.Num() - 1) + { + OrdersDataArgs += Orders[i].GetArgs() + ","; + } + else + { + OrdersDataArgs += Orders[i].GetArgs(); + } + } + + return OrdersDataArgs; + } + +public: + FString WalletAddress; + TArray Orders; + int64 AdditionalFee; + + FGetCheckoutOptionsArgs() + { + this->WalletAddress = ""; + this->Orders = TArray(); + this->AdditionalFee = 0; + } + + FGetCheckoutOptionsArgs(FString WalletAddress, const TArray& Orders, const int64 AdditionalFee) + { + this->WalletAddress = WalletAddress; + this->Orders = Orders; + this->AdditionalFee = AdditionalFee; + } + + bool customGetter = true; + FString GetArgs() const + { + FString ReturnArgs = "{"; + + ReturnArgs += "\"walletAddress\":\"" + WalletAddress + "\","; + ReturnArgs += "\"orders\":[" + GetOrdersDataArgs() + "],"; + ReturnArgs += "\"additionalFee\":\"" + FString::Printf(TEXT("%lld"), AdditionalFee) + "\""; + + ReturnArgs.Append("}"); // Close the JSON object + + return ReturnArgs; + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h new file mode 100644 index 000000000..48ddbd79d --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h @@ -0,0 +1,37 @@ +#pragma once +#include "Checkout/Enums/CheckoutOptions.h" + +#include "GetCheckoutOptionsResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FGetCheckoutOptionsResponse +{ + GENERATED_USTRUCT_BODY() + + public: + ECheckoutOptions Options; + + FGetCheckoutOptionsResponse() + { + this->Options = ECheckoutOptions::CryptoPurchase; + } + + FGetCheckoutOptionsResponse(const ECheckoutOptions Options) + { + this->Options = Options; + } + + bool customConstructor = false; + + void Construct(FJsonObject JSON_In) + { + } + + void Setup(const FJsonObject& JSON_In) + { + if (JSON_In.HasField(TEXT("options"))) + { + this->Options = static_cast(JSON_In.GetIntegerField(TEXT("options"))); + } + } +}; From 288ed1fca6b492a39ae896a46ba80beb5bdc9e2f Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Thu, 13 Feb 2025 09:56:57 -0500 Subject: [PATCH 05/48] Small update for test checkout scripts to resolve build errors --- .../Tests/MarketplaceCheckoutTests.cpp | 111 ++++++++++++++++++ .../Private/Tests/MarketplaceCheckoutTests.h | 33 ++++++ 2 files changed, 144 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp new file mode 100644 index 000000000..ad9cab231 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp @@ -0,0 +1,111 @@ +#include "MarketplaceCheckoutTests.h" + +// Private + +void FMarketplaceCheckoutTests::SubmitStepsAsTransaction(const TArray& Steps, USequenceWallet Wallet) +{ + if (Steps.IsEmpty()) + { + UE_LOG(LogTemp,Display,TEXT("Transaction Steps Is EMPTY")); + return; + } + + +} + +void FMarketplaceCheckoutTests::SeedWalletAndCreateListing(USequenceWallet Wallet, FString Address, + FString CurrencyToken) +{ +} + +void FMarketplaceCheckoutTests::FetchListingAndBuy(FString Address, USequenceWallet Wallet, int32 Retries, + const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) +{ +} + +void FMarketplaceCheckoutTests::FetchListings(FString Collection, int64 ChainId, FSeqCollectiblesFilter Filter, + const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) +{ +} + +void FMarketplaceCheckoutTests::FetchOfferAndSell(FString CollectionAddress, USequenceWallet Wallet, int32 Retries, + const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) +{ +} + +void FMarketplaceCheckoutTests::FetchOffers(FString Collection, int64 ChainId, + const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) +{ +} + +FSeqOrder FMarketplaceCheckoutTests::FindOrderCreatedByWallet(const FString& WalletAddress, + TArray CollectibleOrders) +{ + for (auto [TokenMetadata, Order] : CollectibleOrders) + { + if (Order.CreatedBy == WalletAddress) + { + return Order; + } + } + + return FSeqOrder(); +} + +void FMarketplaceCheckoutTests::FetchListingsForCollectible(FString Collection, FString TokenId, int64 ChainId, + FSeqCollectiblesFilter Filter, const TSuccessCallback>& OnSuccess, + const FFailureCallback& OnFailure) +{ +} + +// Public + +void FMarketplaceCheckoutTests::TestGetCheckoutOptions_Marketplace(int64 Amount) +{ +} + +void FMarketplaceCheckoutTests::TestGetCheckoutOptions_PrimarySale_ERC1155(TArray TokenIds, + TArray Amounts, FString ExpectedException) +{ +} + +void FMarketplaceCheckoutTests::TestGetCheckoutOptions_PrimarySale_ERC721(FString TokenId, int64 Amount, + FString ExpectedException) +{ +} + +void FMarketplaceCheckoutTests::TestGenerateBuyTransaction(int64 Amount) +{ +} + +void FMarketplaceCheckoutTests::TestGenerateSellTransaction(int64 Amount) +{ +} + +void FMarketplaceCheckoutTests::TestGenerateListingTransaction(int64 Amount) +{ +} + +void FMarketplaceCheckoutTests::TestGenerateOfferTransaction(int64 Amount) +{ +} + +void FMarketplaceCheckoutTests::TestGenerateOfferTransaction_NativeCurrency() +{ +} + +void FMarketplaceCheckoutTests::TestCreateListingAndBuyIt() +{ +} + +void FMarketplaceCheckoutTests::TestCreateOfferAndSellIt() +{ +} + +void FMarketplaceCheckoutTests::TestCancelOrder() +{ +} + +void FMarketplaceCheckoutTests::TestCreateListingAndBuyWithNativeCurrency() +{ +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h new file mode 100644 index 000000000..77c7b283c --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h @@ -0,0 +1,33 @@ +#pragma once +#include "Checkout/Structs/TransactionStep.h" +#include "Marketplace/Structs/SeqCollectibleOrder.h" +#include "Marketplace/Structs/SeqCollectiblesFilter.h" +#include "Sequence/SequenceAPI.h" + +class FMarketplaceCheckoutTests +{ + static void SubmitStepsAsTransaction(const TArray& Steps, USequenceWallet Wallet); + static void SeedWalletAndCreateListing(USequenceWallet Wallet, FString Address, FString CurrencyToken); + static void FetchListingAndBuy(FString Address, USequenceWallet Wallet, int32 Retries, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); + static void FetchListings(FString Collection, int64 ChainId, FSeqCollectiblesFilter Filter, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); + static void FetchOfferAndSell(FString CollectionAddress, USequenceWallet Wallet, int32 Retries, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); + static void FetchOffers(FString Collection, int64 ChainId, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); + static FSeqOrder FindOrderCreatedByWallet(const FString& WalletAddress, TArray CollectibleOrders); + static void FetchListingsForCollectible(FString Collection, FString TokenId, int64 ChainId, FSeqCollectiblesFilter Filter, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); + +public: + const FString TestWalletAddress = "0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07"; + + static void TestGetCheckoutOptions_Marketplace(int64 Amount); + static void TestGetCheckoutOptions_PrimarySale_ERC1155(TArray TokenIds, TArray Amounts, FString ExpectedException); + static void TestGetCheckoutOptions_PrimarySale_ERC721(FString TokenId, int64 Amount, FString ExpectedException); + static void TestGenerateBuyTransaction(int64 Amount); + static void TestGenerateSellTransaction(int64 Amount); + static void TestGenerateListingTransaction(int64 Amount); + static void TestGenerateOfferTransaction(int64 Amount); + static void TestGenerateOfferTransaction_NativeCurrency(); + static void TestCreateListingAndBuyIt(); + static void TestCreateOfferAndSellIt(); + static void TestCancelOrder(); + static void TestCreateListingAndBuyWithNativeCurrency(); +}; From f90e4f5ab22d6a9986c29e1a1913f7a9905a9262 Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Thu, 13 Feb 2025 22:38:02 -0500 Subject: [PATCH 06/48] All Checkout functions have been made to support Blueprints --- .../Private/Checkout/Checkout.cpp | 115 +++++++++++++----- .../Private/Checkout/Checkout.h | 34 ++++-- 2 files changed, 108 insertions(+), 41 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp index 6de6ff189..fb16aa1f8 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp @@ -70,20 +70,29 @@ template T UCheckout::BuildResponse(const FString Text) const } void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 AdditionalFeeBps, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const + const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { const FString Endpoint = "CheckoutOptionsMarketplace"; const FString Args = BuildArgs(FGetCheckoutOptionsArgs { Wallet->GetWalletAddress(), Orders, AdditionalFeeBps }); Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGetCheckoutOptionsResponse Response = BuildResponse(Content); + if (OnSuccess.IsBound()) { - const FGetCheckoutOptionsResponse Response = BuildResponse(Content); - OnSuccess(Response); - }, OnFailure); + OnSuccess.Execute(Response); + } + }, [this, OnFailure](const FSequenceError& Error) + { + if (OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); } -void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 AdditionalFeeBps, - const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +void UCheckout::GetCheckoutOptionsByOrders(const TArray& Orders, const int64 AdditionalFeeBps, + const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { TArray Options; Options.Reserve(Orders.Num()); @@ -96,7 +105,7 @@ void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 } void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const + FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; OrdersData.Reserve(1); @@ -108,14 +117,23 @@ void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amoun const FString Args = BuildArgs(FGenerateBuyTransaction{ Order.CollectionContractAddress, Wallet->GetWalletAddress(), Order.Marketplace, OrdersData, AdditionalFees, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) }); Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + if (OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [this, OnFailure](const FSequenceError& Error) + { + if (OnFailure.IsBound()) { - const FGenerateTransactionResponse Response = BuildResponse(Content); - OnSuccess(Response); - }, OnFailure); + OnFailure.Execute(); + } + }); } -void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const +void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, + FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; OrdersData.Reserve(1); @@ -127,15 +145,24 @@ void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, int64 Amount, co const FString Args = BuildArgs(FGenerateSellTransaction{ Order.CollectionContractAddress, Wallet->GetWalletAddress(), Order.Marketplace, OrdersData, AdditionalFees, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) });; Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + if (OnSuccess.IsBound()) { - const FGenerateTransactionResponse Response = BuildResponse(Content); - OnSuccess(Response); - }, OnFailure); + OnSuccess.Execute(Response); + } + }, [this, OnFailure](const FSequenceError& Error) + { + if (OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); } void UCheckout::GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const + FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { int64 EpochTime = Expiry.ToUnixTimestamp(); const FString Endpoint = "GenerateListingTransaction"; @@ -146,16 +173,24 @@ void UCheckout::GenerateListingTransaction(const FString& CollectionAddress, con }); Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + if (OnSuccess.IsBound()) { - const FGenerateTransactionResponse Response = BuildResponse(Content); - OnSuccess(Response); - }, OnFailure); + OnSuccess.Execute(Response); + } + }, [this, OnFailure](const FSequenceError& Error) + { + if (OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); } void UCheckout::GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, - const EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure) const + const EOrderbookKind OrderbookKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { int64 EpochTime = Expiry.ToUnixTimestamp(); const FString Endpoint = "GenerateOfferTransaction"; @@ -166,15 +201,23 @@ void UCheckout::GenerateOfferTransaction(const FString& CollectionAddress, const }); Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + if (OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [this, OnFailure](const FSequenceError& Error) + { + if (OnFailure.IsBound()) { - const FGenerateTransactionResponse Response = BuildResponse(Content); - OnSuccess(Response); - }, OnFailure); + OnFailure.Execute(); + } + }); } void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, - const EMarketplaceKind MarketplaceKind, TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure) const + const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { const FString Endpoint = "GenerateCancelTransaction"; const FString Args = BuildArgs(FGenerateCancelTransactionRequest { @@ -182,15 +225,23 @@ void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, cons }); Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + if (OnSuccess.IsBound()) { - const FGenerateTransactionResponse Response = BuildResponse(Content); - OnSuccess(Response); - }, OnFailure); + OnSuccess.Execute(Response); + } + }, [this, OnFailure](const FSequenceError& Error) + { + if (OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); } -void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, const FSeqOrder& Order, - const EMarketplaceKind MarketplaceKind, const TSuccessCallback& OnSuccess, - const FFailureCallback& OnFailure) const +void UCheckout::GenerateCancelTransactionByOrder(const FString& CollectionAddress, const FSeqOrder& Order, + const EMarketplaceKind MarketplaceKind, const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { GenerateCancelTransaction(CollectionAddress, Order.OrderId, MarketplaceKind, OnSuccess, OnFailure); } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h index 1ac1dedec..3607762a3 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h @@ -1,4 +1,5 @@ #pragma once +#include "Errors.h" #include "Checkout/Structs/AdditionalFee.h" #include "Checkout/Structs/CheckoutOptionsMarketplaceOrder.h" #include "Checkout/Structs/GenerateTransactionResponse.h" @@ -8,6 +9,13 @@ #include "Checkout.generated.h" +UDELEGATE(BlueprintAuthorityOnly) +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnGetCheckoutOptionsResponseSuccess, FGetCheckoutOptionsResponse, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnGenerateTransactionResponseSuccess, FGenerateTransactionResponse, Response); + +UDELEGATE(BlueprintAuthorityOnly) +DECLARE_DYNAMIC_DELEGATE(FOnCheckoutFailure); + UCLASS() class SEQUENCEPLUGIN_API UCheckout : public UObject { @@ -26,13 +34,21 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject template < typename T> FString BuildArgs(T StructIn) const; template < typename T > T BuildResponse(FString Text) const; - - void GetCheckoutOptions(const TArray& Orders, int64 AdditionalFeeBps, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; - void GetCheckoutOptions(const TArray& Orders, int64 AdditionalFeeBps, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; - void GenerateBuyTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; - void GenerateSellTransaction(const FSeqOrder& Order, int64 Amount, const FAdditionalFee& AdditionalFee, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; - void GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; - void GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; - void GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) const; - void GenerateCancelTransaction(const FString& CollectionAddress, const FSeqOrder& Order, EMarketplaceKind MarketplaceKind, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GetCheckoutOptions(const TArray& Orders, int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GetCheckoutOptionsByOrders(const TArray& Orders, const int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure)const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateSellTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateCancelTransactionByOrder(const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; }; From 8aa106f320d1262c99c094bad041ac8283750d5e Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Fri, 14 Feb 2025 12:50:01 -0500 Subject: [PATCH 07/48] All Checkout relevant systems and structs now available via Blueprints --- .../Public/Checkout/Structs/AdditionalFee.h | 4 +++- .../Structs/CheckoutOptionsMarketplaceOrder.h | 7 +++++-- .../Public/Checkout/Structs/CreateReq.h | 7 ++++++- .../SequencePlugin/Public/Checkout/Structs/Domain.h | 8 ++++++-- .../Public/Checkout/Structs/GenerateBuyTransaction.h | 12 +++++++++--- .../Structs/GenerateCancelTransactionRequest.h | 10 +++++++--- .../Structs/GenerateListingTransactionArgs.h | 10 ++++++++-- .../Checkout/Structs/GenerateOfferTransactionArgs.h | 10 ++++++++-- .../Checkout/Structs/GenerateSellTransaction.h | 12 +++++++++--- .../Checkout/Structs/GenerateTransactionResponse.h | 3 ++- .../Public/Checkout/Structs/GetCheckoutOptionsArgs.h | 5 ++++- .../Checkout/Structs/GetCheckoutOptionsResponse.h | 3 ++- .../Public/Checkout/Structs/OrderData.h | 4 +++- .../Public/Checkout/Structs/PostRequest.h | 5 ++++- .../Public/Checkout/Structs/TransactionSignature.h | 6 +++++- .../Public/Checkout/Structs/TransactionStep.h | 8 +++++++- 16 files changed, 88 insertions(+), 26 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h index c51e14cc6..3ed3edbbf 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/AdditionalFee.h @@ -7,7 +7,9 @@ struct SEQUENCEPLUGIN_API FAdditionalFee { GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Amount; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Receiver; FAdditionalFee() @@ -19,7 +21,7 @@ struct SEQUENCEPLUGIN_API FAdditionalFee this->Amount = Amount; this->Receiver = Receiver; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h index afd6be715..81dbee2f1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CheckoutOptionsMarketplaceOrder.h @@ -9,9 +9,12 @@ struct SEQUENCEPLUGIN_API FCheckoutOptionsMarketplaceOrder GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString ContractAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString OrderId; - EMarketplaceKind Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TEnumAsByte Marketplace; FCheckoutOptionsMarketplaceOrder() { @@ -26,7 +29,7 @@ struct SEQUENCEPLUGIN_API FCheckoutOptionsMarketplaceOrder this->OrderId = OrderId; this->Marketplace = Marketplace; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h index e6f2c6c6e..2656466f0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/CreateReq.h @@ -8,10 +8,15 @@ struct SEQUENCEPLUGIN_API FCreateReq GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString TokenId; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Quantity; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Expiry; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString CurrencyAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString PricePerToken; FCreateReq() @@ -31,7 +36,7 @@ struct SEQUENCEPLUGIN_API FCreateReq this->CurrencyAddress = CurrencyAddress; this->PricePerToken = PricePerToken; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h index ec440446e..b4874b98d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h @@ -8,10 +8,14 @@ struct SEQUENCEPLUGIN_API FDomain GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Name; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Version; - uint64 ChainId; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + int64 ChainId; // Chain enum? + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString VerifyingContract; FDomain() @@ -29,7 +33,7 @@ struct SEQUENCEPLUGIN_API FDomain this->ChainId = ChainId; this->VerifyingContract = VerifyingContract; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h index 62050c911..e06facd82 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateBuyTransaction.h @@ -51,18 +51,24 @@ struct SEQUENCEPLUGIN_API FGenerateBuyTransaction } public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString CollectionAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Buyer; - EMarketplaceKind Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TEnumAsByte Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) TArray OrdersData; + UPROPERTY(BlueprintReadWrite, EditAnywhere) TArray AdditionalFees; + UPROPERTY(BlueprintReadWrite, EditAnywhere) EWalletKind WalletType; FGenerateBuyTransaction() { this->CollectionAddress = ""; this->Buyer = ""; - this->Marketplace = SEQUENCE_MARKETPLACE_V2; + this->Marketplace = EMarketplaceKind::SEQUENCE_MARKETPLACE_V2; this->OrdersData = TArray(); this->AdditionalFees = TArray(); this->WalletType = EWalletKind::Unknown; @@ -77,7 +83,7 @@ struct SEQUENCEPLUGIN_API FGenerateBuyTransaction this->AdditionalFees = AdditionalFees; this->WalletType = WalletType; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h index b39fc4ca3..e3a8058f9 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateCancelTransactionRequest.h @@ -9,16 +9,20 @@ struct SEQUENCEPLUGIN_API FGenerateCancelTransactionRequest GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString CollectionAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Maker; - EMarketplaceKind Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TEnumAsByte Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString OrderId; FGenerateCancelTransactionRequest() { this->CollectionAddress = ""; this->Maker = ""; - this->Marketplace = EMarketplaceKind::UNKNOWN_MK; + this->Marketplace = UNKNOWN_MK; this->OrderId = ""; } @@ -29,7 +33,7 @@ struct SEQUENCEPLUGIN_API FGenerateCancelTransactionRequest this->Marketplace = Marketplace; this->OrderId = OrderId; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h index a3d16c2b9..0b8152fe5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h @@ -12,11 +12,17 @@ struct SEQUENCEPLUGIN_API FGenerateListingTransactionArgs GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString CollectionAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Owner; - EContractType ContractType; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TEnumAsByte ContractType; + UPROPERTY(BlueprintReadWrite, EditAnywhere) EOrderbookKind Orderbook; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FCreateReq Listing; + UPROPERTY(BlueprintReadWrite, EditAnywhere) EWalletKind WalletType; FGenerateListingTransactionArgs() @@ -38,7 +44,7 @@ struct SEQUENCEPLUGIN_API FGenerateListingTransactionArgs this->Listing = Listing; this->WalletType = WalletType; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h index 08696f51a..1f1139713 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateOfferTransactionArgs.h @@ -12,11 +12,17 @@ struct SEQUENCEPLUGIN_API FGenerateOfferTransactionArgs GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString CollectionAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Maker; - EContractType ContractType; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TEnumAsByte ContractType; + UPROPERTY(BlueprintReadWrite, EditAnywhere) EOrderbookKind Orderbook; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FCreateReq Offer; + UPROPERTY(BlueprintReadWrite, EditAnywhere) EWalletKind WalletType; FGenerateOfferTransactionArgs() @@ -38,7 +44,7 @@ struct SEQUENCEPLUGIN_API FGenerateOfferTransactionArgs this->Offer = Offer; this->WalletType = WalletType; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h index 708638bef..156a5a1ce 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateSellTransaction.h @@ -51,18 +51,24 @@ struct SEQUENCEPLUGIN_API FGenerateSellTransaction } public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString CollectionAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Seller; - EMarketplaceKind Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TEnumAsByte Marketplace; + UPROPERTY(BlueprintReadWrite, EditAnywhere) TArray OrdersData; + UPROPERTY(BlueprintReadWrite, EditAnywhere) TArray AdditionalFees; + UPROPERTY(BlueprintReadWrite, EditAnywhere) EWalletKind WalletType; FGenerateSellTransaction() { this->CollectionAddress = ""; this->Seller = ""; - this->Marketplace = SEQUENCE_MARKETPLACE_V2; + this->Marketplace = EMarketplaceKind::SEQUENCE_MARKETPLACE_V2; this->OrdersData = TArray(); this->AdditionalFees = TArray(); this->WalletType = EWalletKind::Unknown; @@ -77,7 +83,7 @@ struct SEQUENCEPLUGIN_API FGenerateSellTransaction this->AdditionalFees = AdditionalFees; this->WalletType = WalletType; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h index af2d55fa6..c36d86c0a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h @@ -31,6 +31,7 @@ struct SEQUENCEPLUGIN_API FGenerateTransactionResponse public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) TArray Steps; FGenerateTransactionResponse() @@ -42,7 +43,7 @@ struct SEQUENCEPLUGIN_API FGenerateTransactionResponse { this->Steps = Steps; } - + bool customConstructor = false; void Construct(FJsonObject JSON_In) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h index 81d5f4a74..11f0bf291 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsArgs.h @@ -29,8 +29,11 @@ struct SEQUENCEPLUGIN_API FGetCheckoutOptionsArgs } public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString WalletAddress; + UPROPERTY(BlueprintReadWrite, EditAnywhere) TArray Orders; + UPROPERTY(BlueprintReadWrite, EditAnywhere) int64 AdditionalFee; FGetCheckoutOptionsArgs() @@ -46,7 +49,7 @@ struct SEQUENCEPLUGIN_API FGetCheckoutOptionsArgs this->Orders = Orders; this->AdditionalFee = AdditionalFee; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h index 48ddbd79d..0de2cfe0d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GetCheckoutOptionsResponse.h @@ -9,6 +9,7 @@ struct SEQUENCEPLUGIN_API FGetCheckoutOptionsResponse GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) ECheckoutOptions Options; FGetCheckoutOptionsResponse() @@ -20,7 +21,7 @@ struct SEQUENCEPLUGIN_API FGetCheckoutOptionsResponse { this->Options = Options; } - + bool customConstructor = false; void Construct(FJsonObject JSON_In) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h index 22418f6be..619afe1b0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/OrderData.h @@ -8,7 +8,9 @@ struct SEQUENCEPLUGIN_API FOrderData GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString OrderId; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Quantity; FOrderData() @@ -22,7 +24,7 @@ struct SEQUENCEPLUGIN_API FOrderData this->OrderId = OrderId; this->Quantity = Quantity; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h index ff03055b4..38cc52c5e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h @@ -8,8 +8,11 @@ struct SEQUENCEPLUGIN_API FPostRequest GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString EndPoint; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Method; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Body; FPostRequest() @@ -25,7 +28,7 @@ struct SEQUENCEPLUGIN_API FPostRequest this->Method = Method; this->Body = Body; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h index 2b2e68175..14cd7dd74 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h @@ -10,9 +10,13 @@ struct SEQUENCEPLUGIN_API FTransactionSignature GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) FDomain Domain; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Types; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString PrimaryType; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Value; FTransactionSignature() @@ -30,7 +34,7 @@ struct SEQUENCEPLUGIN_API FTransactionSignature this->PrimaryType = PrimaryType; this->Value = Value; } - + bool customGetter = true; FString GetArgs() const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h index 2a4dfc59f..e1b225de4 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h @@ -12,11 +12,17 @@ struct SEQUENCEPLUGIN_API FTransactionStep GENERATED_USTRUCT_BODY() public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) EStepType Id; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Data; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString To; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FString Value; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FTransactionSignature Signature; + UPROPERTY(BlueprintReadWrite, EditAnywhere) FPostRequest Post; FTransactionStep() @@ -38,7 +44,7 @@ struct SEQUENCEPLUGIN_API FTransactionStep this->Signature = Signature; this->Post = Post; } - + bool customGetter = true; FString GetArgs() const { From 3fdf046934aa406c437cab27be7b4af76dfdbe1b Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Tue, 25 Feb 2025 20:34:29 -0500 Subject: [PATCH 08/48] Checkout is now accessible through subsystem, removed dependency of a Marketplace and Wallet reference in Checkout Subsystem --- .../Core/Testing/BP_CheckoutTesting.uasset | 3 + .../Private/Checkout/Checkout.cpp | 150 ++++++++++++++---- .../Private/Checkout/Checkout.h | 29 ++-- .../Integrators/SequenceCheckoutBP.cpp | 34 ++++ .../Tests/MarketplaceCheckoutTests.cpp | 5 +- .../Private/Tests/MarketplaceCheckoutTests.h | 4 +- .../Public/Integrators/SequenceCheckoutBP.h | 25 +++ 7 files changed, 202 insertions(+), 48 deletions(-) create mode 100644 Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h diff --git a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset new file mode 100644 index 000000000..0fd293837 --- /dev/null +++ b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ace4b48d87da9807328fe4b40eabf39495eff39a51a84131d8106dd37c5c44fa +size 103063 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp index fb16aa1f8..8f0fcf2dc 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp @@ -8,17 +8,98 @@ #include "Checkout/Structs/GetCheckoutOptionsArgs.h" #include "Checkout/Structs/GetCheckoutOptionsResponse.h" #include "Checkout/Structs/OrderData.h" +#include "Util/Log.h" -UCheckout::UCheckout(): ChainID() -{; +FString UCheckout::Url(const int64& TargetChainID, const FString& EndPoint) const +{ + FString Out_URL = HostName(TargetChainID); + Out_URL.Append(this->PATH); + + if (EndPoint.Len() > 0) + { + Out_URL.Append(EndPoint); + } + return Out_URL; +} + +FString UCheckout::HostName(int64 TargetChainID) +{ + FString Hostname = "https://"; + Hostname.Append("marketplace-api.sequence.app/"); + Hostname.Append(USequenceSupport::GetNetworkNameForUrl(TargetChainID)); + return Hostname; +} + +void UCheckout::HTTPPost(const int64& TargetChainID, const FString& Endpoint, const FString& Args, + const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + const FString RequestURL = this->Url(TargetChainID, Endpoint); + + const TSharedRef HTTP_Post_Req = FHttpModule::Get().CreateRequest(); + + FString AccessKey = UConfigFetcher::GetConfigVar("ProjectAccessKey"); + if (AccessKey.IsEmpty()) + { + UE_LOG(LogTemp, Error, TEXT("AccessKey is empty! Failed to set HTTP header.")); + return; + } + + HTTP_Post_Req->SetVerb("POST"); + HTTP_Post_Req->SetHeader(TEXT("Content-Type"), TEXT("application/json")); + HTTP_Post_Req->SetHeader(TEXT("Accept"), TEXT("application/json")); + + + HTTP_Post_Req->SetHeader(TEXT("X-Access-Key"), *AccessKey); + HTTP_Post_Req->SetTimeout(30); + HTTP_Post_Req->SetURL(RequestURL); + HTTP_Post_Req->SetContentAsString(Args); + + FString CurlCommand = FString::Printf( + TEXT("curl -X %s \"%s\" -H \"Content-Type: application/json\" -H \"Accept: application/json\" -H \"X-Access-Key: %s\" --data \"%s\""), + *HTTP_Post_Req->GetVerb(), + *HTTP_Post_Req->GetURL(), + *HTTP_Post_Req->GetHeader("X-Access-Key"), + *FString(UTF8_TO_TCHAR(HTTP_Post_Req->GetContent().GetData())).Replace(TEXT("\""), TEXT("\\\"")) + ); + + SEQ_LOG_EDITOR(Log, TEXT("%s"), *CurlCommand); + + + HTTP_Post_Req->OnProcessRequestComplete().BindLambda([OnSuccess, OnFailure](const FHttpRequestPtr& Request, FHttpResponsePtr Response, const bool bWasSuccessful) + { + if (bWasSuccessful) + { + const FString Content = Response->GetContentAsString(); + UE_LOG(LogTemp, Display, TEXT("Response: %s"), *Content); + OnSuccess(Content); + } + else + { + if (Request.IsValid() && Response.IsValid()) + { + const FString ErrorMessage = Response->GetContentAsString(); + UE_LOG(LogTemp, Error, TEXT("Request failed: %s"), *ErrorMessage); + OnFailure(FSequenceError(RequestFail, "Request failed: " + ErrorMessage)); + } + else + { + UE_LOG(LogTemp, Error, TEXT("Request failed: Invalid Request Pointer")); + OnFailure(FSequenceError(RequestFail, "Request failed: Invalid Request Pointer")); + } + } + }); + + // Process the request + HTTP_Post_Req->ProcessRequest(); +} + +UCheckout::UCheckout() +{ this->ChainID = 0; } -UCheckout::UCheckout(UMarketplace* Marketplace, USequenceWallet* InWallet, const int64& InChainID): - ChainID() +UCheckout::UCheckout(const int64& InChainID) { - this->Marketplace = Marketplace; - this->Wallet = InWallet; this->ChainID = InChainID; } @@ -69,13 +150,18 @@ template T UCheckout::BuildResponse(const FString Text) const return Ret_Struct; } -void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 AdditionalFeeBps, +void UCheckout::SetChainID(const int64& NewChainID) +{ + this->ChainID = NewChainID; +} + +void UCheckout::GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { const FString Endpoint = "CheckoutOptionsMarketplace"; - const FString Args = BuildArgs(FGetCheckoutOptionsArgs { Wallet->GetWalletAddress(), Orders, AdditionalFeeBps }); + const FString Args = BuildArgs(FGetCheckoutOptionsArgs { WalletAddress, Orders, AdditionalFeeBps }); - Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) { const FGetCheckoutOptionsResponse Response = BuildResponse(Content); if (OnSuccess.IsBound()) @@ -91,7 +177,7 @@ void UCheckout::GetCheckoutOptions(const TArray& Orders, const int64 AdditionalFeeBps, +void UCheckout::GetCheckoutOptionsByOrders(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { TArray Options; @@ -101,10 +187,10 @@ void UCheckout::GetCheckoutOptionsByOrders(const TArray& Orders, cons Options[i] = FCheckoutOptionsMarketplaceOrder(Orders[i].CollectionContractAddress, Orders[i].OrderId, Orders[i].Marketplace); } - GetCheckoutOptions(Options, AdditionalFeeBps, OnSuccess, OnFailure); + GetCheckoutOptions(WalletAddress, Options, AdditionalFeeBps, OnSuccess, OnFailure); } -void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, +void UCheckout::GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; @@ -114,9 +200,9 @@ void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amoun const TArray AdditionalFees { AdditionalFee }; const FString Endpoint = "GenerateBuyTransaction"; - const FString Args = BuildArgs(FGenerateBuyTransaction{ Order.CollectionContractAddress, Wallet->GetWalletAddress(), Order.Marketplace, OrdersData, AdditionalFees, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) }); + const FString Args = BuildArgs(FGenerateBuyTransaction{ Order.CollectionContractAddress, WalletAddress, Order.Marketplace, OrdersData, AdditionalFees, WalletKind }); - Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) { const FGenerateTransactionResponse Response = BuildResponse(Content); if (OnSuccess.IsBound()) @@ -132,7 +218,7 @@ void UCheckout::GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amoun }); } -void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, +void UCheckout::GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; @@ -142,9 +228,9 @@ void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, const int64 Amou const TArray AdditionalFees { AdditionalFee }; const FString Endpoint = "GenerateSellTransaction"; - const FString Args = BuildArgs(FGenerateSellTransaction{ Order.CollectionContractAddress, Wallet->GetWalletAddress(), Order.Marketplace, OrdersData, AdditionalFees, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) });; + const FString Args = BuildArgs(FGenerateSellTransaction{ Order.CollectionContractAddress, WalletAddress, Order.Marketplace, OrdersData, AdditionalFees, WalletKind });; - Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) { const FGenerateTransactionResponse Response = BuildResponse(Content); if (OnSuccess.IsBound()) @@ -160,19 +246,19 @@ void UCheckout::GenerateSellTransaction(const FSeqOrder& Order, const int64 Amou }); } -void UCheckout::GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, - const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, +void UCheckout::GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, + const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { int64 EpochTime = Expiry.ToUnixTimestamp(); const FString Endpoint = "GenerateListingTransaction"; const FString Args = BuildArgs(FGenerateListingTransactionArgs { - CollectionAddress, Wallet->GetWalletAddress(), ContractType, OrderbookKind, FCreateReq { + CollectionAddress, WalletAddress, ContractType, OrderbookKind, FCreateReq { TokenId, FString::Printf(TEXT("%lld"), Amount), FString::Printf(TEXT("%lld"), EpochTime), CurrencyTokenAddress, FString::Printf(TEXT("%lld"), PricePerToken) - }, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) + }, WalletKind }); - Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) { const FGenerateTransactionResponse Response = BuildResponse(Content); if (OnSuccess.IsBound()) @@ -188,19 +274,19 @@ void UCheckout::GenerateListingTransaction(const FString& CollectionAddress, con }); } -void UCheckout::GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, const int64 Amount, +void UCheckout::GenerateOfferTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, - const EOrderbookKind OrderbookKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const + const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { int64 EpochTime = Expiry.ToUnixTimestamp(); const FString Endpoint = "GenerateOfferTransaction"; const FString Args = BuildArgs(FGenerateOfferTransactionArgs { - CollectionAddress, Wallet->GetWalletAddress(), ContractType, OrderbookKind, FCreateReq { + CollectionAddress, WalletAddress, ContractType, OrderbookKind, FCreateReq { TokenId, FString::Printf(TEXT("%lld"), Amount), FString::Printf(TEXT("%lld"), EpochTime), CurrencyTokenAddress, FString::Printf(TEXT("%lld"), PricePerToken) - }, UMarketplaceWalletKindExtensions::GetWalletKind(Wallet) + }, WalletKind }); - Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) { const FGenerateTransactionResponse Response = BuildResponse(Content); if (OnSuccess.IsBound()) @@ -216,15 +302,15 @@ void UCheckout::GenerateOfferTransaction(const FString& CollectionAddress, const }); } -void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, +void UCheckout::GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& OrderId, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { const FString Endpoint = "GenerateCancelTransaction"; const FString Args = BuildArgs(FGenerateCancelTransactionRequest { - CollectionAddress, Wallet->GetWalletAddress(), MarketplaceKind, OrderId + CollectionAddress, WalletAddress, MarketplaceKind, OrderId }); - Marketplace->HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) { const FGenerateTransactionResponse Response = BuildResponse(Content); if (OnSuccess.IsBound()) @@ -240,8 +326,8 @@ void UCheckout::GenerateCancelTransaction(const FString& CollectionAddress, cons }); } -void UCheckout::GenerateCancelTransactionByOrder(const FString& CollectionAddress, const FSeqOrder& Order, +void UCheckout::GenerateCancelTransactionByOrder(const FString& WalletAddress, const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { - GenerateCancelTransaction(CollectionAddress, Order.OrderId, MarketplaceKind, OnSuccess, OnFailure); + GenerateCancelTransaction(WalletAddress, CollectionAddress, Order.OrderId, MarketplaceKind, OnSuccess, OnFailure); } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h index 3607762a3..4c201d855 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h @@ -6,6 +6,7 @@ #include "Checkout/Structs/GetCheckoutOptionsResponse.h" #include "Marketplace/Marketplace.h" #include "Sequence/SequenceAPI.h" +#include "Sequence/Wallet_Enums.h" #include "Checkout.generated.h" @@ -22,33 +23,39 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject GENERATED_BODY() private: - UMarketplace* Marketplace = nullptr; - USequenceWallet* Wallet = nullptr; int64 ChainID; + + const FString PATH = "/rpc/Marketplace/"; + + FString Url(const int64& TargetChainID,const FString& EndPoint) const; + static FString HostName(int64 TargetChainID); + void HTTPPost(const int64& TargetChainID,const FString& Endpoint,const FString& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; public: // Constructor UCheckout(); - UCheckout(UMarketplace* Marketplace, USequenceWallet* InWallet, const int64& InChainID); + UCheckout(const int64& InChainID); template < typename T> FString BuildArgs(T StructIn) const; template < typename T > T BuildResponse(FString Text) const; + + void SetChainID(const int64& InChainID); UFUNCTION(BlueprintCallable, Category = "Checkout") - void GetCheckoutOptions(const TArray& Orders, int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GetCheckoutOptionsByOrders(const TArray& Orders, const int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure)const; + void GetCheckoutOptionsByOrders(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure)const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateBuyTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateSellTransaction(const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateListingTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateOfferTransaction(const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateOfferTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateCancelTransaction(const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateCancelTransactionByOrder(const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateCancelTransactionByOrder(const FString& WalletAddress, const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp new file mode 100644 index 000000000..2947aa583 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp @@ -0,0 +1,34 @@ +#include "Integrators/SequenceCheckoutBP.h" + +void USequenceCheckoutBP::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + UE_LOG(LogTemp, Warning, TEXT("SequenceCheckoutBP::Initialize")); +} + +void USequenceCheckoutBP::Deinitialize() +{ + Super::Deinitialize(); + UE_LOG(LogTemp, Warning, TEXT("SequenceCheckoutBP::Deinitialize")); +} + +bool USequenceCheckoutBP::ShouldCreateSubsystem(UObject* Outer) const +{ + if (this->GetClass()->IsInBlueprint() && Super::ShouldCreateSubsystem(Outer)) + { + return true; + } + + return false; +} + +USequenceCheckoutBP::USequenceCheckoutBP() +{ + this->Checkout = NewObject(); +} + +UCheckout* USequenceCheckoutBP::GetCheckout() const +{ + return this->Checkout; +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp index ad9cab231..c670c3ce4 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.cpp @@ -1,6 +1,5 @@ #include "MarketplaceCheckoutTests.h" -// Private void FMarketplaceCheckoutTests::SubmitStepsAsTransaction(const TArray& Steps, USequenceWallet Wallet) { @@ -64,12 +63,12 @@ void FMarketplaceCheckoutTests::TestGetCheckoutOptions_Marketplace(int64 Amount) { } -void FMarketplaceCheckoutTests::TestGetCheckoutOptions_PrimarySale_ERC1155(TArray TokenIds, +void FMarketplaceCheckoutTests::TestGetCheckoutOptions_PrimarySale_Erc1155(TArray TokenIds, TArray Amounts, FString ExpectedException) { } -void FMarketplaceCheckoutTests::TestGetCheckoutOptions_PrimarySale_ERC721(FString TokenId, int64 Amount, +void FMarketplaceCheckoutTests::TestGetCheckoutOptions_PrimarySale_Erc721(FString TokenId, int64 Amount, FString ExpectedException) { } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h index 77c7b283c..ef3c9138b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Tests/MarketplaceCheckoutTests.h @@ -19,8 +19,8 @@ class FMarketplaceCheckoutTests const FString TestWalletAddress = "0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07"; static void TestGetCheckoutOptions_Marketplace(int64 Amount); - static void TestGetCheckoutOptions_PrimarySale_ERC1155(TArray TokenIds, TArray Amounts, FString ExpectedException); - static void TestGetCheckoutOptions_PrimarySale_ERC721(FString TokenId, int64 Amount, FString ExpectedException); + static void TestGetCheckoutOptions_PrimarySale_Erc1155(TArray TokenIds, TArray Amounts, FString ExpectedException); + static void TestGetCheckoutOptions_PrimarySale_Erc721(FString TokenId, int64 Amount, FString ExpectedException); static void TestGenerateBuyTransaction(int64 Amount); static void TestGenerateSellTransaction(int64 Amount); static void TestGenerateListingTransaction(int64 Amount); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h new file mode 100644 index 000000000..deff520e3 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h @@ -0,0 +1,25 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Checkout/Checkout.h" +#include "Subsystems/GameInstanceSubsystem.h" +#include "SequenceCheckoutBP.generated.h" + +UCLASS(Blueprintable) +class SEQUENCEPLUGIN_API USequenceCheckoutBP : public UGameInstanceSubsystem +{ + GENERATED_BODY() + + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + virtual bool ShouldCreateSubsystem(UObject* Outer) const override; + +public: + USequenceCheckoutBP(); + UFUNCTION(BlueprintCallable, Category = "0xSequence SDK/Checkout") + UCheckout* GetCheckout() const; + +private: + UCheckout* Checkout; + +}; From 332c5645e93bf474916157d5b4f4345118539bd4 Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Thu, 6 Mar 2025 14:53:41 -0500 Subject: [PATCH 09/48] Switched project version to 5.5 --- .vsconfig | 4 +++- SequenceUnreal.uproject | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.vsconfig b/.vsconfig index 7f5f4b38f..b3c233d09 100644 --- a/.vsconfig +++ b/.vsconfig @@ -2,9 +2,11 @@ "version": "1.0", "components": [ "Microsoft.Net.Component.4.6.2.TargetingPack", + "Microsoft.VisualStudio.Component.Unreal.Workspace", + "Microsoft.VisualStudio.Component.VC.14.38.17.8.ATL", "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", - "Microsoft.VisualStudio.Component.Windows10SDK.22621", + "Microsoft.VisualStudio.Component.Windows11SDK.22621", "Microsoft.VisualStudio.Workload.CoreEditor", "Microsoft.VisualStudio.Workload.ManagedDesktop", "Microsoft.VisualStudio.Workload.NativeDesktop", diff --git a/SequenceUnreal.uproject b/SequenceUnreal.uproject index db1f5ce4c..6bf7e86e6 100644 --- a/SequenceUnreal.uproject +++ b/SequenceUnreal.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "5.4", + "EngineAssociation": "5.5", "Category": "", "Description": "", "Modules": [ From 018c504f8147376807b08b3dbd687bac886ef583 Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Tue, 18 Mar 2025 16:42:48 -0400 Subject: [PATCH 10/48] Resolved issues around preparing data for post and handling data sent back as JSON then converting it into local objects --- .../Core/Testing/BP_CheckoutTesting.uasset | 4 +-- .../Core/Testing/BP_GeneralTesting.uasset | 4 +-- .../Private/Checkout/Checkout.cpp | 4 +-- .../Private/Checkout/Checkout.h | 1 + .../Integrators/SequenceCheckoutBP.cpp | 30 ++++++++++------ .../Public/Checkout/Enums/StepType.h | 29 +++++++++++++++ .../Public/Checkout/Structs/Domain.h | 28 ++++++++++++--- .../Structs/GenerateListingTransactionArgs.h | 14 ++++---- .../Structs/GenerateTransactionResponse.h | 5 ++- .../Public/Checkout/Structs/PostRequest.h | 19 +++++++--- .../Checkout/Structs/TransactionSignature.h | 35 ++++++++++++++----- .../Public/Checkout/Structs/TransactionStep.h | 31 +++++++++------- .../Public/Integrators/SequenceCheckoutBP.h | 13 ++++--- .../Public/Marketplace/Marketplace_Enums.h | 28 ++++++++++++++- .../Public/Sequence/Wallet_Enums.h | 14 ++++++++ 15 files changed, 198 insertions(+), 61 deletions(-) diff --git a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset index 0fd293837..f776fbe09 100644 --- a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset +++ b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ace4b48d87da9807328fe4b40eabf39495eff39a51a84131d8106dd37c5c44fa -size 103063 +oid sha256:f9b8fe15ef1e69af6e1a46368da1ac07967b1b1259360173787676d6a9c834be +size 153212 diff --git a/Plugins/SequencePlugin/Content/Core/Testing/BP_GeneralTesting.uasset b/Plugins/SequencePlugin/Content/Core/Testing/BP_GeneralTesting.uasset index 56d097664..786828c4d 100644 --- a/Plugins/SequencePlugin/Content/Core/Testing/BP_GeneralTesting.uasset +++ b/Plugins/SequencePlugin/Content/Core/Testing/BP_GeneralTesting.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9592f0930baf48dea1577e9c91dcd95ae6db3168743bf52c6081ab3e5fa0995a -size 285841 +oid sha256:3ecdcc26276c1ac78a45ae1ad5ee4525d02cc38fe3552e8fc1ec366bd247db39 +size 287134 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp index 8f0fcf2dc..5b80c15c7 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp @@ -150,9 +150,9 @@ template T UCheckout::BuildResponse(const FString Text) const return Ret_Struct; } -void UCheckout::SetChainID(const int64& NewChainID) +void UCheckout::SetChainID(const int64& InChainID) { - this->ChainID = NewChainID; + this->ChainID = InChainID; } void UCheckout::GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h index 4c201d855..a18a38edd 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h @@ -40,6 +40,7 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject template < typename T > T BuildResponse(FString Text) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") void SetChainID(const int64& InChainID); UFUNCTION(BlueprintCallable, Category = "Checkout") diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp index 2947aa583..c177b33e2 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp @@ -13,22 +13,32 @@ void USequenceCheckoutBP::Deinitialize() UE_LOG(LogTemp, Warning, TEXT("SequenceCheckoutBP::Deinitialize")); } -bool USequenceCheckoutBP::ShouldCreateSubsystem(UObject* Outer) const +USequenceCheckoutBP::USequenceCheckoutBP() { - if (this->GetClass()->IsInBlueprint() && Super::ShouldCreateSubsystem(Outer)) - { - return true; - } + UE_LOG(LogTemp, Warning, TEXT("SequenceCheckoutBP::Constructor")); - return false; + this->Checkout = NewObject(); } -USequenceCheckoutBP::USequenceCheckoutBP() +void USequenceCheckoutBP::SetChainID(const int64& InChainID) { - this->Checkout = NewObject(); + this->Checkout->SetChainID(InChainID); } -UCheckout* USequenceCheckoutBP::GetCheckout() const +void USequenceCheckoutBP::GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, + const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, + const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, + const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { - return this->Checkout; + this->Checkout->GenerateListingTransaction(WalletAddress, CollectionAddress, TokenId, Amount, ContractType, CurrencyTokenAddress, PricePerToken, Expiry, OrderbookKind, WalletKind, OnSuccess, OnFailure); } + +// UCheckout* USequenceCheckoutBP::GetCheckout() const +// { +// if (this->Checkout == nullptr) +// { +// this->Checkout = NewObject(); +// } +// +// return this->Checkout; +// } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h index 2febd44ab..ab65c5d2d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h @@ -1,4 +1,5 @@ #pragma once +#include "StepType.generated.h" UENUM(Blueprintable) enum class EStepType : uint8 @@ -12,3 +13,31 @@ enum class EStepType : uint8 SignEip712 UMETA(DisplayName = "signEIP712"), SignEip191 UMETA(DisplayName = "signEIP191"), }; + +UCLASS() +class SEQUENCEPLUGIN_API UStepType : public UObject +{ + GENERATED_BODY() + +public: + static EStepType GetStepTypeFromString(const FString& StepTypeString) + { + const FString EStepTypeString{ TEXT("EStepType") }; + + if (const UEnum* StepTypeEnum{ FindObject(ANY_PACKAGE, *EStepTypeString, true) }) + { + const int32 Index{ StepTypeEnum->GetIndexByNameString(StepTypeString) }; + + // Check if the enum is valid + if (const EStepType RegionInfoCheck{ static_cast(static_cast(Index)) }; UEnum::GetValueAsString(RegionInfoCheck) != TEXT("None")) + { + return RegionInfoCheck; + } + } + + // Fallback if nothing is found + constexpr EStepType StepType{ EStepType::Unknown }; + return StepType; + } +}; + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h index b4874b98d..5f273d077 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/Domain.h @@ -50,11 +50,29 @@ struct SEQUENCEPLUGIN_API FDomain return ReturnArgs; } - void Setup(FJsonObject& JSON_In) + void Setup(const FJsonObject& JSON_In) { - Name = JSON_In.GetStringField(TEXT("name")); - Version = JSON_In.GetStringField(TEXT("version")); - ChainId = JSON_In.GetIntegerField(TEXT("chainId")); - VerifyingContract = JSON_In.GetStringField(TEXT("verifyingContract")); + FString ReturnStringValue; + int64 ReturnIntegerValue; + + if (JSON_In.TryGetStringField(TEXT("name"), ReturnStringValue)) + { + this->Name = ReturnStringValue; + } + + if (JSON_In.TryGetStringField(TEXT("version"), ReturnStringValue)) + { + this->Version = ReturnStringValue; + } + + if (JSON_In.TryGetNumberField(TEXT("chainId"), ReturnIntegerValue)) + { + this->ChainId = ReturnIntegerValue; + } + + if (JSON_In.TryGetStringField(TEXT("verifyingContract"), ReturnStringValue)) + { + this->VerifyingContract = ReturnStringValue; + } } }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h index 0b8152fe5..2a4674e66 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateListingTransactionArgs.h @@ -29,7 +29,7 @@ struct SEQUENCEPLUGIN_API FGenerateListingTransactionArgs { this->CollectionAddress = ""; this->Owner = ""; - this->ContractType = EContractType::UNKOWN_CT; + this->ContractType = UNKOWN_CT; this->Orderbook = EOrderbookKind::Unknown; this->Listing = FCreateReq(); this->WalletType = EWalletKind::Sequence; @@ -40,7 +40,7 @@ struct SEQUENCEPLUGIN_API FGenerateListingTransactionArgs this->CollectionAddress = CollectionAddress; this->Owner = Owner; this->ContractType = ContractType; - this->Orderbook = Orderbook; + this->Orderbook = OrderbookKind; this->Listing = Listing; this->WalletType = WalletType; } @@ -49,15 +49,15 @@ struct SEQUENCEPLUGIN_API FGenerateListingTransactionArgs FString GetArgs() const { FString ReturnArgs = "{"; - + ReturnArgs += "\"collectionAddress\":\"" + CollectionAddress + "\","; ReturnArgs += "\"owner\":\"" + Owner + "\","; ReturnArgs += "\"contractType\":\"" + UEnum::GetValueAsString(ContractType) + "\","; - ReturnArgs += "\"orderbook\":\"" + UEnum::GetValueAsString(Orderbook) + "\","; - ReturnArgs += "\"listing\":\"" + Listing.GetArgs() + "\","; - ReturnArgs += "\"WalletType\":\"" + UEnum::GetValueAsString(WalletType) + "\""; + ReturnArgs += "\"orderbook\":\"" + UMarketplaceEnumsExtensions::AsString(Orderbook) + "\","; + ReturnArgs += "\"listing\":" + Listing.GetArgs() + ","; + ReturnArgs += "\"walletType\":\"" + UMarketplaceWalletKindExtensions::AsString(WalletType) + "\""; - ReturnArgs.Append("}"); // Close the JSON object + ReturnArgs.Append("}");// Close the JSON object return ReturnArgs; } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h index c36d86c0a..337aefb3c 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/GenerateTransactionResponse.h @@ -58,11 +58,10 @@ struct SEQUENCEPLUGIN_API FGenerateTransactionResponse Steps.Empty(); for (int32 i = 0; i < StepsArray.Num(); ++i) { - TSharedPtr StepValue = StepsArray[i]; - if (StepValue->Type == EJson::Object) + if (const TSharedPtr StepValue = StepsArray[i]; StepValue->Type == EJson::Object) { FTransactionStep Step; - TSharedPtr StepJsonObject = USequenceSupport::JsonStringToObject(StepValue->AsString()); + TSharedPtr StepJsonObject = StepValue->AsObject();//USequenceSupport::JsonStringToObject(StepValue->AsString()); Step.Setup(*StepJsonObject); Steps.Add(Step); } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h index 38cc52c5e..191326b2c 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/PostRequest.h @@ -43,10 +43,21 @@ struct SEQUENCEPLUGIN_API FPostRequest return ReturnArgs; } - void Setup(FJsonObject& JSON_In) + void Setup(const FJsonObject& JSON_In) { - EndPoint = JSON_In.GetStringField(TEXT("endPoint")); - Method = JSON_In.GetStringField(TEXT("method")); - Body = JSON_In.GetStringField(TEXT("body")); + if (FString ReturnEndPointString; JSON_In.TryGetStringField(TEXT("endPoint"), ReturnEndPointString)) + { + EndPoint = ReturnEndPointString; + } + + if (FString ReturnMethodString; JSON_In.TryGetStringField(TEXT("method"), ReturnMethodString)) + { + Method = ReturnMethodString; + } + + if (FString ReturnBodyString; JSON_In.TryGetStringField(TEXT("body"), ReturnBodyString)) + { + Body = ReturnBodyString; + } } }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h index 14cd7dd74..b0fa4f917 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionSignature.h @@ -40,7 +40,7 @@ struct SEQUENCEPLUGIN_API FTransactionSignature { FString ReturnArgs = "{"; - ReturnArgs += "\"domain\":\"" + Domain.GetArgs() + "\","; + ReturnArgs += "\"domain\":" + Domain.GetArgs() + ","; ReturnArgs += "\"types\":\"" + Types + "\","; ReturnArgs += "\"primaryType\":\"" + PrimaryType + "\","; ReturnArgs += "\"value\":\"" + Value + "\""; @@ -51,18 +51,35 @@ struct SEQUENCEPLUGIN_API FTransactionSignature return ReturnArgs; } - void Setup(FJsonObject& JSON_In) + void Setup(const FJsonObject& JSON_In) { // Setup Domain - if (JSON_In.TryGetField(TEXT("domain"))) + if (JSON_In.HasField(TEXT("domain"))) { - const TSharedPtr DomainValue = JSON_In.GetField(TEXT("domain"), EJson::Object); - const TSharedPtr DomainJsonObject = USequenceSupport::JsonStringToObject(DomainValue->AsString()); - Domain.Setup(*DomainJsonObject); + const TSharedPtr DomainValue = JSON_In.TryGetField(TEXT("domain")); + if (DomainValue != nullptr) + { + const TSharedPtr DomainJsonObject = DomainValue->AsObject(); //USequenceSupport::JsonStringToObject(DomainValue->AsString()); + if (DomainJsonObject != nullptr) + { + Domain.Setup(*DomainJsonObject); + } + } + } + + if (FString ReturnTypesString; JSON_In.TryGetStringField(TEXT("types"), ReturnTypesString)) + { + Types = ReturnTypesString; + } + + if (FString ReturnPrimaryTypeString; JSON_In.TryGetStringField(TEXT("primaryType"), ReturnPrimaryTypeString)) + { + PrimaryType = ReturnPrimaryTypeString; } - Types = JSON_In.GetStringField(TEXT("types")); - PrimaryType = JSON_In.GetStringField(TEXT("primaryType")); - Value = JSON_In.GetStringField(TEXT("value")); + if (FString ReturnValueString; JSON_In.TryGetStringField(TEXT("value"), ReturnValueString)) + { + Value = ReturnValueString; + } } }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h index e1b225de4..1140f72f9 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h @@ -54,37 +54,44 @@ struct SEQUENCEPLUGIN_API FTransactionStep ReturnArgs += "\"data\":\"" + Data + "\","; ReturnArgs += "\"to\":\"" + To + "\","; ReturnArgs += "\"value\":\"" + Value + "\","; - ReturnArgs += "\"signature\":\"" + Signature.GetArgs() + "\","; - ReturnArgs += "\"post\":\"" + Post.GetArgs() + "\""; + ReturnArgs += "\"signature\":" + Signature.GetArgs() + ","; + ReturnArgs += "\"post\":" + Post.GetArgs(); ReturnArgs.Append("}"); // Close the JSON object return ReturnArgs; } - void Setup(FJsonObject& JSON_In) + void Setup(const FJsonObject& JSON_In) { if (JSON_In.TryGetField(TEXT("id"))) { - Id = static_cast(JSON_In.GetIntegerField(TEXT("id"))); + Id = UStepType::GetStepTypeFromString(JSON_In.GetStringField(TEXT("id"))); } Data = JSON_In.GetStringField(TEXT("data")); To = JSON_In.GetStringField(TEXT("to")); Value = JSON_In.GetStringField(TEXT("value")); // Setup Signature - if (JSON_In.TryGetField(TEXT("signature"))) + if (JSON_In.HasField(TEXT("signature"))) { - const TSharedPtr SignatureValue = JSON_In.GetField(TEXT("signature"), EJson::Object); - TSharedPtr SignatureJsonObject = USequenceSupport::JsonStringToObject(SignatureValue->AsString()); - Signature.Setup(*SignatureJsonObject); + const TSharedPtr SignatureValue = JSON_In.TryGetField(TEXT("signature")); + if (SignatureValue != nullptr) + { + TSharedPtr SignatureJsonObject = SignatureValue->AsObject(); + Signature.Setup(*SignatureJsonObject); + } } // Setup Post Request - if (JSON_In.TryGetField(TEXT("post"))) + if (JSON_In.HasField(TEXT("post"))) { - const TSharedPtr PostRequestValue = JSON_In.GetField(TEXT("post"), EJson::Object); - const TSharedPtr PostRequestJsonObject = USequenceSupport::JsonStringToObject(PostRequestValue->AsString()); - Post.Setup(*PostRequestJsonObject); + const TSharedPtr PostRequestValue = JSON_In.TryGetField(TEXT("post")); + + if (PostRequestValue != nullptr) + { + TSharedPtr PostRequestJsonObject = PostRequestValue->AsObject(); + Post.Setup(*PostRequestJsonObject); + } } } }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h index deff520e3..0d1b4730b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h @@ -5,19 +5,24 @@ #include "Subsystems/GameInstanceSubsystem.h" #include "SequenceCheckoutBP.generated.h" -UCLASS(Blueprintable) +UCLASS() class SEQUENCEPLUGIN_API USequenceCheckoutBP : public UGameInstanceSubsystem { GENERATED_BODY() virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; - virtual bool ShouldCreateSubsystem(UObject* Outer) const override; public: USequenceCheckoutBP(); - UFUNCTION(BlueprintCallable, Category = "0xSequence SDK/Checkout") - UCheckout* GetCheckout() const; + // UFUNCTION(BlueprintCallable, Category = "0xSequence SDK/Checkout") + // UCheckout* GetCheckout() const; + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SetChainID(const int64& InChainID); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; private: UCheckout* Checkout; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h index f660a04a5..7bef5df48 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace_Enums.h @@ -89,6 +89,32 @@ class UMarketplaceEnumsExtensions : public UObject public: + template + static FString AsString(EnumType EnumValue); + + template<> + FString AsString(const EOrderbookKind OrderbookKind) + { + switch (OrderbookKind) + { + case EOrderbookKind::Sequence_Marketplace_V1: + return FString("sequence_marketplace_v1"); + case EOrderbookKind::Sequence_Marketplace_V2: + return FString("sequence_marketplace_v2"); + case EOrderbookKind::Blur: + return FString("blur"); + case EOrderbookKind::Opensea: + return FString("opensea"); + case EOrderbookKind::Looks_Rare: + return FString("looks_rare"); + case EOrderbookKind::Reservoir: + return FString("reservoir"); + case EOrderbookKind::X2Y2: + return FString("x2y2"); + default: return FString("unknown"); + } + } + template static FString AsString(TEnumAsByte EnumValue); @@ -164,4 +190,4 @@ class UMarketplaceEnumsExtensions : public UObject } return StringArray; } -}; \ No newline at end of file +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h index 0bfa3ecc2..0451c5dae 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/Wallet_Enums.h @@ -27,5 +27,19 @@ class UMarketplaceWalletKindExtensions : public UObject return EWalletKind::Unknown; } + + template + static FString AsString(EnumType EnumValue); + + template<> + FString AsString(const EWalletKind OrderbookKind) + { + switch (OrderbookKind) + { + case EWalletKind::Sequence: + return FString("sequence"); + default: return FString("unknown"); + } + } }; From ebd4f5e8a8c540bf59f05294b4f4be66a0a37e00 Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Wed, 19 Mar 2025 16:07:00 -0400 Subject: [PATCH 11/48] Added remaining functions to be invoked from blueprints in SequenceCheckoutBP --- .../Private/Checkout/Checkout.cpp | 4 +- .../Private/Checkout/Checkout.h | 4 +- .../Integrators/SequenceCheckoutBP.cpp | 58 ++++++++++++++++--- .../Public/Checkout/Enums/StepType.h | 15 +++-- .../Public/Integrators/SequenceCheckoutBP.h | 20 +++++-- 5 files changed, 76 insertions(+), 25 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp index 5b80c15c7..e1c7344eb 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp @@ -13,7 +13,7 @@ FString UCheckout::Url(const int64& TargetChainID, const FString& EndPoint) const { FString Out_URL = HostName(TargetChainID); - Out_URL.Append(this->PATH); + Out_URL.Append(this->Path); if (EndPoint.Len() > 0) { @@ -250,7 +250,7 @@ void UCheckout::GenerateListingTransaction(const FString& WalletAddress, const F const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { - int64 EpochTime = Expiry.ToUnixTimestamp(); + const int64 EpochTime = Expiry.ToUnixTimestamp(); const FString Endpoint = "GenerateListingTransaction"; const FString Args = BuildArgs(FGenerateListingTransactionArgs { CollectionAddress, WalletAddress, ContractType, OrderbookKind, FCreateReq { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h index a18a38edd..974cbae7e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h @@ -25,7 +25,7 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject private: int64 ChainID; - const FString PATH = "/rpc/Marketplace/"; + const FString Path = "/rpc/Marketplace/"; FString Url(const int64& TargetChainID,const FString& EndPoint) const; static FString HostName(int64 TargetChainID); @@ -34,7 +34,7 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject public: // Constructor UCheckout(); - UCheckout(const int64& InChainID); + explicit UCheckout(const int64& InChainID); template < typename T> FString BuildArgs(T StructIn) const; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp index c177b33e2..eb10b6604 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp @@ -20,11 +20,39 @@ USequenceCheckoutBP::USequenceCheckoutBP() this->Checkout = NewObject(); } +// Do NOT add const for this function, breaks how we get the chainID void USequenceCheckoutBP::SetChainID(const int64& InChainID) { this->Checkout->SetChainID(InChainID); } +void USequenceCheckoutBP::GetCheckoutOptions(const FString& WalletAddress, + const TArray& Orders, const int64 AdditionalFeeBps, + const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GetCheckoutOptions(WalletAddress, Orders, AdditionalFeeBps, OnSuccess, OnFailure); +} + +void USequenceCheckoutBP::GetCheckoutOptionsByOrders(const FString& WalletAddress, const TArray& Orders, + const int64 AdditionalFeeBps, const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GetCheckoutOptionsByOrders(WalletAddress, Orders, AdditionalFeeBps, OnSuccess, OnFailure); +} + +void USequenceCheckoutBP::GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, + const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, + const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GenerateBuyTransaction(WalletAddress, Order, Amount, AdditionalFee, WalletKind, OnSuccess, OnFailure); +} + +void USequenceCheckoutBP::GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, + const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, + const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GenerateSellTransaction(WalletAddress, Order, Amount, AdditionalFee, WalletKind, OnSuccess, OnFailure); +} + void USequenceCheckoutBP::GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, @@ -33,12 +61,24 @@ void USequenceCheckoutBP::GenerateListingTransaction(const FString& WalletAddres this->Checkout->GenerateListingTransaction(WalletAddress, CollectionAddress, TokenId, Amount, ContractType, CurrencyTokenAddress, PricePerToken, Expiry, OrderbookKind, WalletKind, OnSuccess, OnFailure); } -// UCheckout* USequenceCheckoutBP::GetCheckout() const -// { -// if (this->Checkout == nullptr) -// { -// this->Checkout = NewObject(); -// } -// -// return this->Checkout; -// } +void USequenceCheckoutBP::GenerateOfferTransaction(const FString& WalletAddress, const FString& CollectionAddress, + const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, + const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, + const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GenerateOfferTransaction(WalletAddress, CollectionAddress, TokenId, Amount, ContractType, CurrencyTokenAddress, PricePerToken, Expiry, OrderbookKind, WalletKind, OnSuccess, OnFailure); +} + +void USequenceCheckoutBP::GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, + const FString& OrderId, const EMarketplaceKind MarketplaceKind, const FOnGenerateTransactionResponseSuccess OnSuccess, + const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GenerateCancelTransaction(WalletAddress, CollectionAddress, OrderId, MarketplaceKind, OnSuccess, OnFailure); +} + +void USequenceCheckoutBP::GenerateCancelTransactionByOrder(const FString& WalletAddress, + const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, + const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const +{ + this->Checkout->GenerateCancelTransactionByOrder(WalletAddress, CollectionAddress, Order, MarketplaceKind, OnSuccess, OnFailure); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h index ab65c5d2d..ca0f2800a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Enums/StepType.h @@ -1,6 +1,7 @@ #pragma once #include "StepType.generated.h" +ENUM_RANGE_BY_COUNT(EStepType, 8) UENUM(Blueprintable) enum class EStepType : uint8 { @@ -22,16 +23,14 @@ class SEQUENCEPLUGIN_API UStepType : public UObject public: static EStepType GetStepTypeFromString(const FString& StepTypeString) { - const FString EStepTypeString{ TEXT("EStepType") }; - - if (const UEnum* StepTypeEnum{ FindObject(ANY_PACKAGE, *EStepTypeString, true) }) + FText EnumDisplayText = FText::FromString(""); + for (const EStepType Val : TEnumRange()) { - const int32 Index{ StepTypeEnum->GetIndexByNameString(StepTypeString) }; - - // Check if the enum is valid - if (const EStepType RegionInfoCheck{ static_cast(static_cast(Index)) }; UEnum::GetValueAsString(RegionInfoCheck) != TEXT("None")) + UEnum::GetDisplayValueAsText(Val, EnumDisplayText); + + if (UEnum::GetValueAsString(Val).Equals(StepTypeString) || EnumDisplayText.ToString().Equals(StepTypeString)) { - return RegionInfoCheck; + return Val; } } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h index 0d1b4730b..8f14d3b3d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h @@ -15,15 +15,27 @@ class SEQUENCEPLUGIN_API USequenceCheckoutBP : public UGameInstanceSubsystem public: USequenceCheckoutBP(); - // UFUNCTION(BlueprintCallable, Category = "0xSequence SDK/Checkout") - // UCheckout* GetCheckout() const; UFUNCTION(BlueprintCallable, Category = "Checkout") void SetChainID(const int64& InChainID); - + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GetCheckoutOptionsByOrders(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure)const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") void GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; - + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateOfferTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, int64 Amount, EContractType ContractType, const FString& CurrencyTokenAddress, int64 PricePerToken, FDateTime Expiry, EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateCancelTransactionByOrder(const FString& WalletAddress, const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + private: UCheckout* Checkout; From 849ec177c1a7661848c38c8dddb756159f7e22c9 Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Tue, 25 Mar 2025 13:16:10 -0400 Subject: [PATCH 12/48] Renamed Checkout to SequenceCheckout. Moved the SequenceCheckout header to the public folder --- .../Core/Testing/BP_CheckoutTesting.uasset | 4 +- .../{Checkout.cpp => SequenceCheckout.cpp} | 34 +++++++-------- .../Integrators/SequenceCheckoutBP.cpp | 27 ++++++++++-- .../Checkout/SequenceCheckout.h} | 8 ++-- .../Public/Checkout/Structs/TransactionStep.h | 41 +++++++++++++++++++ .../Public/Integrators/SequenceCheckoutBP.h | 10 +++-- 6 files changed, 94 insertions(+), 30 deletions(-) rename Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/{Checkout.cpp => SequenceCheckout.cpp} (84%) rename Plugins/SequencePlugin/Source/SequencePlugin/{Private/Checkout/Checkout.h => Public/Checkout/SequenceCheckout.h} (95%) diff --git a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset index f776fbe09..b52549895 100644 --- a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset +++ b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9b8fe15ef1e69af6e1a46368da1ac07967b1b1259360173787676d6a9c834be -size 153212 +oid sha256:aee1135789abbfc1b510e4300e6d3fd89fbfd6060ff97b5fa98eb37b731cd6f9 +size 165833 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp similarity index 84% rename from Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp rename to Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp index e1c7344eb..ebee65e27 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp @@ -1,4 +1,4 @@ -#include "Checkout.h" +#include "Checkout/SequenceCheckout.h" #include "Checkout/Structs/GenerateBuyTransaction.h" #include "Checkout/Structs/GenerateCancelTransactionRequest.h" @@ -10,7 +10,7 @@ #include "Checkout/Structs/OrderData.h" #include "Util/Log.h" -FString UCheckout::Url(const int64& TargetChainID, const FString& EndPoint) const +FString USequenceCheckout::Url(const int64& TargetChainID, const FString& EndPoint) const { FString Out_URL = HostName(TargetChainID); Out_URL.Append(this->Path); @@ -22,7 +22,7 @@ FString UCheckout::Url(const int64& TargetChainID, const FString& EndPoint) cons return Out_URL; } -FString UCheckout::HostName(int64 TargetChainID) +FString USequenceCheckout::HostName(int64 TargetChainID) { FString Hostname = "https://"; Hostname.Append("marketplace-api.sequence.app/"); @@ -30,7 +30,7 @@ FString UCheckout::HostName(int64 TargetChainID) return Hostname; } -void UCheckout::HTTPPost(const int64& TargetChainID, const FString& Endpoint, const FString& Args, +void USequenceCheckout::HTTPPost(const int64& TargetChainID, const FString& Endpoint, const FString& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const { const FString RequestURL = this->Url(TargetChainID, Endpoint); @@ -93,17 +93,17 @@ void UCheckout::HTTPPost(const int64& TargetChainID, const FString& Endpoint, co HTTP_Post_Req->ProcessRequest(); } -UCheckout::UCheckout() +USequenceCheckout::USequenceCheckout() { this->ChainID = 0; } -UCheckout::UCheckout(const int64& InChainID) +USequenceCheckout::USequenceCheckout(const int64& InChainID) { this->ChainID = InChainID; } -template < typename T> FString UCheckout::BuildArgs(T StructIn) const +template < typename T> FString USequenceCheckout::BuildArgs(T StructIn) const { FString Result = "[FAILED TO PARSE]"; if (StructIn.customGetter) @@ -121,7 +121,7 @@ template < typename T> FString UCheckout::BuildArgs(T StructIn) const } -template T UCheckout::BuildResponse(const FString Text) const +template T USequenceCheckout::BuildResponse(const FString Text) const { //Take the FString and convert it to a JSON object first! TSharedPtr JSON_Step; @@ -150,12 +150,12 @@ template T UCheckout::BuildResponse(const FString Text) const return Ret_Struct; } -void UCheckout::SetChainID(const int64& InChainID) +void USequenceCheckout::SetChainID(const int64& InChainID) { this->ChainID = InChainID; } -void UCheckout::GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, +void USequenceCheckout::GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { const FString Endpoint = "CheckoutOptionsMarketplace"; @@ -177,7 +177,7 @@ void UCheckout::GetCheckoutOptions(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, +void USequenceCheckout::GetCheckoutOptionsByOrders(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, const FOnGetCheckoutOptionsResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { TArray Options; @@ -190,7 +190,7 @@ void UCheckout::GetCheckoutOptionsByOrders(const FString& WalletAddress, const T GetCheckoutOptions(WalletAddress, Options, AdditionalFeeBps, OnSuccess, OnFailure); } -void UCheckout::GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, +void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; @@ -218,7 +218,7 @@ void UCheckout::GenerateBuyTransaction(const FString& WalletAddress, const FSeqO }); } -void UCheckout::GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, +void USequenceCheckout::GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; @@ -246,7 +246,7 @@ void UCheckout::GenerateSellTransaction(const FString& WalletAddress, const FSeq }); } -void UCheckout::GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, +void USequenceCheckout::GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { @@ -274,7 +274,7 @@ void UCheckout::GenerateListingTransaction(const FString& WalletAddress, const F }); } -void UCheckout::GenerateOfferTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, +void USequenceCheckout::GenerateOfferTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { @@ -302,7 +302,7 @@ void UCheckout::GenerateOfferTransaction(const FString& WalletAddress, const FSt }); } -void UCheckout::GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& OrderId, +void USequenceCheckout::GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& OrderId, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { const FString Endpoint = "GenerateCancelTransaction"; @@ -326,7 +326,7 @@ void UCheckout::GenerateCancelTransaction(const FString& WalletAddress, const FS }); } -void UCheckout::GenerateCancelTransactionByOrder(const FString& WalletAddress, const FString& CollectionAddress, const FSeqOrder& Order, +void USequenceCheckout::GenerateCancelTransactionByOrder(const FString& WalletAddress, const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { GenerateCancelTransaction(WalletAddress, CollectionAddress, Order.OrderId, MarketplaceKind, OnSuccess, OnFailure); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp index eb10b6604..2360dea34 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp @@ -17,7 +17,7 @@ USequenceCheckoutBP::USequenceCheckoutBP() { UE_LOG(LogTemp, Warning, TEXT("SequenceCheckoutBP::Constructor")); - this->Checkout = NewObject(); + this->Checkout = NewObject(); } // Do NOT add const for this function, breaks how we get the chainID @@ -54,9 +54,9 @@ void USequenceCheckoutBP::GenerateSellTransaction(const FString& WalletAddress, } void USequenceCheckoutBP::GenerateListingTransaction(const FString& WalletAddress, const FString& CollectionAddress, - const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, - const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, - const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const + const FString& TokenId, const int64 Amount, const EContractType ContractType, const FString& CurrencyTokenAddress, + const int64 PricePerToken, const FDateTime Expiry, const EOrderbookKind OrderbookKind, const EWalletKind WalletKind, + const FOnGenerateTransactionResponseSuccess OnSuccess, const FOnCheckoutFailure OnFailure) const { this->Checkout->GenerateListingTransaction(WalletAddress, CollectionAddress, TokenId, Amount, ContractType, CurrencyTokenAddress, PricePerToken, Expiry, OrderbookKind, WalletKind, OnSuccess, OnFailure); } @@ -82,3 +82,22 @@ void USequenceCheckoutBP::GenerateCancelTransactionByOrder(const FString& Wallet { this->Checkout->GenerateCancelTransactionByOrder(WalletAddress, CollectionAddress, Order, MarketplaceKind, OnSuccess, OnFailure); } + +UTransactions* USequenceCheckoutBP::StepsToTransactions(const TArray& Steps) +{ + UTransactions* Transactions = CreateTransaction(); + + for (const FTransactionStep& Step : Steps) + { + FRawTransaction RawTransaction = FRawTransaction(Step.To, Step.Value, Step.Data); + Transactions->AddRaw(RawTransaction); + } + + return Transactions; +} + +UTransactions* USequenceCheckoutBP::CreateTransaction() +{ + return NewObject(this); +} + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h similarity index 95% rename from Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h rename to Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h index 974cbae7e..1ba465e7b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Checkout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h @@ -8,7 +8,7 @@ #include "Sequence/SequenceAPI.h" #include "Sequence/Wallet_Enums.h" -#include "Checkout.generated.h" +#include "SequenceCheckout.generated.h" UDELEGATE(BlueprintAuthorityOnly) DECLARE_DYNAMIC_DELEGATE_OneParam(FOnGetCheckoutOptionsResponseSuccess, FGetCheckoutOptionsResponse, Response); @@ -18,7 +18,7 @@ UDELEGATE(BlueprintAuthorityOnly) DECLARE_DYNAMIC_DELEGATE(FOnCheckoutFailure); UCLASS() -class SEQUENCEPLUGIN_API UCheckout : public UObject +class SEQUENCEPLUGIN_API USequenceCheckout : public UObject { GENERATED_BODY() @@ -33,8 +33,8 @@ class SEQUENCEPLUGIN_API UCheckout : public UObject public: // Constructor - UCheckout(); - explicit UCheckout(const int64& InChainID); + USequenceCheckout(); + explicit USequenceCheckout(const int64& InChainID); template < typename T> FString BuildArgs(T StructIn) const; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h index 1140f72f9..afc9aeac0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Structs/TransactionStep.h @@ -2,10 +2,16 @@ #include "PostRequest.h" #include "TransactionSignature.h" #include "Checkout/Enums/StepType.h" +#include "Sequence/SequenceAPI.h" +#include "Sequence/Transactions.h" #include "Util/SequenceSupport.h" #include "TransactionStep.generated.h" +UDELEGATE(BlueprintAuthorityOnly) +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnGetSequenceTransactionResponseSuccess, FSeqTransactionResponse_Data, Response); +DECLARE_DYNAMIC_DELEGATE(FOnGetSeqTransactionFailure); + USTRUCT(BlueprintType) struct SEQUENCEPLUGIN_API FTransactionStep { @@ -94,4 +100,39 @@ struct SEQUENCEPLUGIN_API FTransactionStep } } } + + static TArray AsTransactionArray(const TArray& Steps) + { + if (Steps.IsEmpty()) + { + UE_LOG(LogTemp, Error, TEXT("Steps cannot be null or empty")); + } + + TArray Transactions; + Transactions.Reserve(Steps.Num()); + for (int i = 0; i < Steps.Num(); i++) + { + Transactions[i] = TUnion( + FRawTransaction(Steps[i].To, Steps[i].Value, Steps[i].Data)); + } + + return Transactions; + } + + static FTransactionStep ExtractBuyStep(const TArray& Steps) + { + FTransactionStep Result; + + const int64 Length = Steps.Num(); + for (int i = 0; i < Length; i++) + { + if (Steps[i].Id == EStepType::Buy) + { + Result = Steps[i]; + break; + } + } + + return Result; + } }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h index 8f14d3b3d..4ced473d1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SequenceCheckoutBP.h @@ -1,8 +1,9 @@ #pragma once #include "CoreMinimal.h" -#include "Checkout/Checkout.h" +#include "Checkout/SequenceCheckout.h" #include "Subsystems/GameInstanceSubsystem.h" +#include "Sequence/SequenceResponseIntent.h" #include "SequenceCheckoutBP.generated.h" UCLASS() @@ -35,8 +36,11 @@ class SEQUENCEPLUGIN_API USequenceCheckoutBP : public UGameInstanceSubsystem void GenerateCancelTransaction(const FString& WalletAddress, const FString& CollectionAddress, const FString& OrderId, EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") void GenerateCancelTransactionByOrder(const FString& WalletAddress, const FString& CollectionAddress, const FSeqOrder& Order, const EMarketplaceKind MarketplaceKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + UTransactions* StepsToTransactions(const TArray& Steps); private: - UCheckout* Checkout; - + USequenceCheckout* Checkout; + + UTransactions* CreateTransaction(); }; From 2667fdba1ea6e08361d919c2c3c8ee425f04cb8e Mon Sep 17 00:00:00 2001 From: Cole Azevedo Date: Wed, 26 Mar 2025 11:41:10 -0400 Subject: [PATCH 13/48] Fixed an issue of incorrect data being managed when converting steps into transactions --- .../Content/Core/Testing/BP_CheckoutTesting.uasset | 4 ++-- .../Private/Integrators/SequenceCheckoutBP.cpp | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset index b52549895..e2f6f717f 100644 --- a/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset +++ b/Plugins/SequencePlugin/Content/Core/Testing/BP_CheckoutTesting.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aee1135789abbfc1b510e4300e6d3fd89fbfd6060ff97b5fa98eb37b731cd6f9 -size 165833 +oid sha256:dd032eaeed29bbf5bbc30da2a870ee3fbf7c9da6159919898b1dc68b4f3a883c +size 168834 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp index 2360dea34..e0e6e1d3a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SequenceCheckoutBP.cpp @@ -88,8 +88,9 @@ UTransactions* USequenceCheckoutBP::StepsToTransactions(const TArrayAddRaw(RawTransaction); } From 3ec44b5298865e9814fb7a970001653b2c59acd4 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 17 Oct 2024 13:05:31 -0400 Subject: [PATCH 14/48] Updated SignInOutRepeatedlyTest such that it verifies that the session ids each time are unique. In addition, exposed the session id in the SequenceAPI --- .../Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index 3b0490cb3..9770205d0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -201,6 +201,12 @@ void USequenceWallet::GetIdToken(const FString& Nonce, const TSuccessCallbackCredentials.GetSessionWallet()->GetSessionId(); +} + + void USequenceWallet::ListSessions(const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) const { if (this->SequenceRPCManager) From 88a888dab7b21e3af8b784b8aab3da770d7d87f9 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 10 Oct 2024 15:01:41 -0300 Subject: [PATCH 15/48] First Commit for validation Set up and start validation. Calculate digest and compare (failing currently ) --- .../SequencePlugin/Private/RequestHandler.cpp | 66 +++++++++++++++++++ .../Private/ResponseSignatureValidator.cpp | 11 +++- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp index db40c0942..0c899e514 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp @@ -194,3 +194,69 @@ void URequestHandler::ProcessAndThen(const TSuccessCallback& OnSucc OnFailure(FSequenceError(RequestFail, "Failed to build QR Image data")); });//lambda } + +void URequestHandler::ProcessAndThen(TFunction OnSuccess, FFailureCallback OnFailure) const +{ + Process().BindLambda([OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) + { + FString CurlCommand = FString::Printf( + TEXT("curl -X %s \"%s\" -H \"Content-Type: application/json\" -H \"Accept: application/json\" -H \"X-Access-Key: %s\" --data \"%s\""), + *Req->GetVerb(), + *Req->GetURL(), + *Req->GetHeader("X-Access-Key"), + *FString::Printf(TEXT("%s"),*FString(UTF8_TO_TCHAR(Req->GetContent().GetData())).Replace(TEXT("\""), TEXT("\\\""))) + ); + + SEQ_LOG_EDITOR(Log,TEXT("%s"), *CurlCommand); + SEQ_LOG_EDITOR(Log,TEXT("%s"), *Response->GetContentAsString()); + + if (bWasSuccessful) + { + UResponseSignatureValidator * Validator = NewObject(); + + if (Validator->ValidateResponseSignature(Response)) + { + UE_LOG(LogTemp, Log, TEXT("Valid Signature")); + + OnSuccess(Response.Get()->GetContentAsString()); + } + else + { + UE_LOG(LogTemp, Log, TEXT("Invalid Signature")); + + OnFailure(FSequenceError(RequestFail, "Invalid response Signature")); + } + + } + else + { + if(Response.IsValid()) + { + OnFailure(FSequenceError(RequestFail, "Request is invalid" + Response->GetContentAsString())); + } + else + { + OnFailure(FSequenceError(RequestFail, "Request failed: No response received!")); + } + } + }); +} + +void URequestHandler::ProcessAndThen(TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) const +{ + Process().BindLambda([OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) + { + if(bWasSuccessful) + { + OnSuccess(Response); + } + else + { + if(!Response.IsValid()) + OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); + else + OnFailure(FSequenceError(RequestFail, "Request failed: " + Response->GetContentAsString())); + } + }); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp index ed19aeb2b..d84ced597 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp @@ -71,13 +71,15 @@ bool UResponseSignatureValidator::ValidateResponseSignature(const FHttpResponseP if (!Response.IsValid()) { tamperedResponseSignatureFound = true; - return false; + return false; // Invalid response } + // Extract headers const FString ContentDigestHeader = Response->GetHeader(TEXT("content-digest")); const FString SignatureHeader = Response->GetHeader(TEXT("signature")); const FString SignatureInputHeader = Response->GetHeader(TEXT("signature-input")); - + + // Validate that headers are present if (ContentDigestHeader.IsEmpty()) { UE_LOG(LogTemp, Error, TEXT("ContentDigestHeader is empty.")); @@ -103,11 +105,14 @@ bool UResponseSignatureValidator::ValidateResponseSignature(const FHttpResponseP FString CleanContentDigestHeader = ContentDigestHeader; const FString Prefix = TEXT("sha-256="); if (CleanContentDigestHeader.StartsWith(Prefix)) + { CleanContentDigestHeader = CleanContentDigestHeader.RightChop(Prefix.Len()); + } CleanContentDigestHeader.RemoveAt(0); CleanContentDigestHeader.RemoveAt(CleanContentDigestHeader.Len() - 1); + // Decode the Content-Digest header from Base64 TArray DecodedDigest; if (!FBase64::Decode(CleanContentDigestHeader, DecodedDigest)) @@ -117,8 +122,10 @@ bool UResponseSignatureValidator::ValidateResponseSignature(const FHttpResponseP return false; } + // Compute the SHA-256 hash of the response content Sha256Hash ComputedHash = Sha256().getHash(ResponseContent.GetData(), ResponseContent.Num()); + // Convert the computed hash to a Base64 string TArray HashBytes = TArray(ComputedHash.value, ComputedHash.HASH_LEN); FString ExpectedDigestBase64 = FBase64::Encode(HashBytes); From d28bbbb24fbc7bef7441a91571c20c91d12ca429 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Wed, 16 Oct 2024 10:24:25 -0300 Subject: [PATCH 16/48] Added VerifySignature Construction of signature base and verifying signature process using unreals OPENSSL library. Included Open SSL PublicDependencyModule --- .../Private/ResponseSignatureValidator.cpp | 38 +++++++++++++++---- .../Private/ResponseSignatureValidator.h | 4 ++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp index d84ced597..5b6fbad72 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.cpp @@ -18,18 +18,22 @@ void UResponseSignatureValidator::LoadPublicKey() if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid()) { + // Extract the key values const TArray> Keys = JsonObject->GetArrayField("keys"); const TSharedPtr Key = Keys[0]->AsObject(); FString ExponentStr = Key->GetStringField("e"); FString ModulusStr = Key->GetStringField("n"); + // Decode the Base64 URL values TArray ExponentBytes = Base64UrlDecode(ExponentStr); TArray ModulusBytes = Base64UrlDecode(ModulusStr); + // Convert to OpenSSL BIGNUM format BIGNUM* ExponentBN = BN_bin2bn(ExponentBytes.GetData(), ExponentBytes.Num(), NULL); BIGNUM* ModulusBN = BN_bin2bn(ModulusBytes.GetData(), ModulusBytes.Num(), NULL); + // Create the RSA key structure WaasPublicKey = RSA_new(); RSA_set0_key(WaasPublicKey, ModulusBN, ExponentBN, NULL); @@ -47,6 +51,7 @@ TArray UResponseSignatureValidator::Base64UrlDecode(const FString& Input) FString Output = Input; Output = Output.Replace(TEXT("-"), TEXT("+")).Replace(TEXT("_"), TEXT("/")); + // Adjust for padding while (Output.Len() % 4 != 0) { Output.AppendChar('='); @@ -64,8 +69,9 @@ FString UResponseSignatureValidator::GetValue(const FString& HeaderItem) { return HeaderItem.Mid(FirstColon + 1, LastColon - FirstColon - 1).TrimStartAndEnd(); } - return FString(); + return FString(); // Return empty if no valid value found. } + bool UResponseSignatureValidator::ValidateResponseSignature(const FHttpResponsePtr& Response) { if (!Response.IsValid()) @@ -136,19 +142,23 @@ bool UResponseSignatureValidator::ValidateResponseSignature(const FHttpResponseP return false; } + // Construct the signature base + // Parse the signature value from the header FString Signature = GetValue(SignatureHeader); if (Signature.IsEmpty()) { UE_LOG(LogTemp, Error, TEXT("Failed to parse Signature header.")); - tamperedResponseSignatureFound = true; return false; } + // Remove the "sig=" prefix from the SignatureInput header FString SignatureInputValue = SignatureInputHeader.Replace(TEXT("sig="), TEXT("")); + // Construct the SignatureBase string FString SignatureBase = FString::Printf(TEXT("\"content-digest\": sha-256=:%s:\n\"@signature-params\": %s"), *CleanContentDigestHeader, *SignatureInputValue); + // Here, you can log or return the SignatureBase if needed UE_LOG(LogTemp, Log, TEXT("Signature Base: %s"), *SignatureBase); return VerifySignature(SignatureBase, Signature); @@ -156,44 +166,51 @@ bool UResponseSignatureValidator::ValidateResponseSignature(const FHttpResponseP bool UResponseSignatureValidator::VerifySignature(const FString& SignatureBase, const FString& Signature) { + // Convert signature from Base64 to byte array TArray SignatureBytes; if (!FBase64::Decode(Signature, SignatureBytes)) { UE_LOG(LogTemp, Error, TEXT("Failed to decode signature from Base64")); tamperedResponseSignatureFound = true; - return false; + return false; // Return false on failure } + // Convert SignatureBase (the data to verify) to byte array (UTF-8 encoding) TArray DataBytes; FTCHARToUTF8 Converter(*SignatureBase); DataBytes.Append((uint8*)Converter.Get(), Converter.Length()); + // Verify the signature using the loaded RSA public key EVP_PKEY* PublicKey = EVP_PKEY_new(); - EVP_PKEY_assign_RSA(PublicKey, WaasPublicKey); + EVP_PKEY_assign_RSA(PublicKey, WaasPublicKey); // WaasPublicKey is the RSA key EVP_MD_CTX* mdCtx = EVP_MD_CTX_new(); EVP_PKEY_CTX* pkeyCtx = nullptr; + // Initialize signature verification if (EVP_DigestVerifyInit(mdCtx, &pkeyCtx, EVP_sha256(), nullptr, PublicKey) <= 0) { UE_LOG(LogTemp, Error, TEXT("Failed to initialize signature verification")); EVP_MD_CTX_free(mdCtx); EVP_PKEY_free(PublicKey); tamperedResponseSignatureFound = true; - return false; + return false; // Return false on failure } + // Update with data to verify if (EVP_DigestVerifyUpdate(mdCtx, DataBytes.GetData(), DataBytes.Num()) <= 0) { UE_LOG(LogTemp, Error, TEXT("Failed to update signature verification with data")); EVP_MD_CTX_free(mdCtx); EVP_PKEY_free(PublicKey); tamperedResponseSignatureFound = true; - return false; + return false; // Return false on failure } + // Perform the actual verification int result = EVP_DigestVerifyFinal(mdCtx, SignatureBytes.GetData(), SignatureBytes.Num()); + // Clean up OpenSSL structures EVP_MD_CTX_free(mdCtx); EVP_PKEY_free(PublicKey); @@ -201,14 +218,19 @@ bool UResponseSignatureValidator::VerifySignature(const FString& SignatureBase, { UE_LOG(LogTemp, Error, TEXT("Signature is invalid")); tamperedResponseSignatureFound = true; - return false; + return false; // Return false if signature verification fails } + // If everything was successful UE_LOG(LogTemp, Log, TEXT("Signature is valid")); - return true; + return true; // Return true if verification is successful } bool UResponseSignatureValidator::HasFoundTamperedResponse() { return tamperedResponseSignatureFound; } + +//l2am+8M1yDQUrezN2FqVJfMKsngtsv6p9Rvp11Ies0NMYd9lFcoQbqOCdEXklRT4eymVC4iFhUI4I4wimjOTopDptwfyQy8Fyo9tei0CqfnQejdIdIcGDaz6ncn68uow82jQTOuaEjkEHuxnQSRd46KrJQRdvHx7oL9koCxCThISb8JVgiOn7FdS2ZJ4XkU9WpBseL5FLiQW6M3PP9+77WaRJ+5MvVukAva6dblRdx497fB5TUbZsZzMh/duU+M2NkNebCpMmEFgOHsRmMRWSkKHwGhzFycNqiwyxrMOmdludz+Gpi9ZCoaiWuzb1ZC7gvhMCsxWtXc9oG5iv5U3hA== + +//"content-digest": sha-256=:g2r98q/9/5HDXq3LaiqNXmHaPQfruwSgefdPzt7uwlg=:"@signature-params": ("content-digest"); created = 1728998376; keyid = "nWh-_3nQ1lnhhI1ZSQTQmw"; alg = "rsa-v1_5-sha256" diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.h index 74b2fde64..1d9f849ce 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ResponseSignatureValidator.h @@ -49,3 +49,7 @@ class SEQUENCEPLUGIN_API UResponseSignatureValidator : public UObject FString GetValue(const FString& HeaderItem); }; + + +//UResponseSignatureValidator + From 28135d36abd4ead7efaf2b548f38924cf26f9c3c Mon Sep 17 00:00:00 2001 From: caballoninja Date: Tue, 22 Oct 2024 12:39:03 -0300 Subject: [PATCH 17/48] Futher Validator checks Implemented Signature tampering checks for all http requesthandler calls. --- .../SequencePlugin/Private/RequestHandler.cpp | 79 ++++++------------- .../Private/Sequence/SequenceAPI.cpp | 55 +++++++++++++ 2 files changed, 79 insertions(+), 55 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp index 0c899e514..1356c3873 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp @@ -195,68 +195,37 @@ void URequestHandler::ProcessAndThen(const TSuccessCallback& OnSucc });//lambda } -void URequestHandler::ProcessAndThen(TFunction OnSuccess, FFailureCallback OnFailure) const +void URequestHandler::ProcessAndThen(UResponseSignatureValidator& Validator, TFunction OnSuccess, FFailureCallback OnFailure) const { - Process().BindLambda([OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) + if (Validator.HasFoundTamperedResponse()) { - FString CurlCommand = FString::Printf( - TEXT("curl -X %s \"%s\" -H \"Content-Type: application/json\" -H \"Accept: application/json\" -H \"X-Access-Key: %s\" --data \"%s\""), - *Req->GetVerb(), - *Req->GetURL(), - *Req->GetHeader("X-Access-Key"), - *FString::Printf(TEXT("%s"),*FString(UTF8_TO_TCHAR(Req->GetContent().GetData())).Replace(TEXT("\""), TEXT("\\\""))) - ); - - SEQ_LOG_EDITOR(Log,TEXT("%s"), *CurlCommand); - SEQ_LOG_EDITOR(Log,TEXT("%s"), *Response->GetContentAsString()); - - if (bWasSuccessful) - { - UResponseSignatureValidator * Validator = NewObject(); - - if (Validator->ValidateResponseSignature(Response)) - { - UE_LOG(LogTemp, Log, TEXT("Valid Signature")); - - OnSuccess(Response.Get()->GetContentAsString()); - } - else - { - UE_LOG(LogTemp, Log, TEXT("Invalid Signature")); - - OnFailure(FSequenceError(RequestFail, "Invalid response Signature")); - } + UE_LOG(LogTemp, Error, TEXT("Validator is null!")); + OnFailure(FSequenceError(RequestFail, "Validator is null.")); + return; + } - } - else + Process().BindLambda([&Validator,OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) { - if(Response.IsValid()) + if (bWasSuccessful) { - OnFailure(FSequenceError(RequestFail, "Request is invalid" + Response->GetContentAsString())); + if (Validator.ValidateResponseSignature(Response)) + { + UE_LOG(LogTemp, Log, TEXT("Valid Signature")); + OnSuccess(Response->GetContentAsString()); + } + else + { + UE_LOG(LogTemp, Log, TEXT("Invalid Signature")); + OnFailure(FSequenceError(RequestFail, "Invalid response Signature")); + } } else { - OnFailure(FSequenceError(RequestFail, "Request failed: No response received!")); + if (Response.IsValid()) + OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); + else + OnFailure(FSequenceError(RequestFail, "Request failed: " + Response->GetContentAsString())); } - } - }); -} - -void URequestHandler::ProcessAndThen(TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure) const -{ - Process().BindLambda([OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) - { - if(bWasSuccessful) - { - OnSuccess(Response); - } - else - { - if(!Response.IsValid()) - OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); - else - OnFailure(FSequenceError(RequestFail, "Request failed: " + Response->GetContentAsString())); - } - }); + }); + } } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index 9770205d0..be6e9a850 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -13,6 +13,61 @@ #include "Transak.h" #include "SequenceRPCManager.h" +FTransaction_Sequence FTransaction_Sequence::Convert(const FTransaction_FE& Transaction_Fe) +{ + return FTransaction_Sequence{ + static_cast(Transaction_Fe.chainId), + FAddress::From(Transaction_Fe.From), + FAddress::From(Transaction_Fe.To), + Transaction_Fe.AutoGas == "" ? TOptional() : TOptional(Transaction_Fe.AutoGas), + Transaction_Fe.Nonce < 0 ? TOptional() : TOptional(static_cast(Transaction_Fe.Nonce)), + Transaction_Fe.Value == "" ? TOptional() : TOptional(Transaction_Fe.Value), + Transaction_Fe.CallData == "" ? TOptional() : TOptional(Transaction_Fe.CallData), + Transaction_Fe.TokenAddress == "" ? TOptional() : TOptional(Transaction_Fe.TokenAddress), + Transaction_Fe.TokenAmount == "" ? TOptional() : TOptional(Transaction_Fe.TokenAmount), + Transaction_Fe.TokenIds.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenIds), + Transaction_Fe.TokenAmounts.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenAmounts), + }; +} + +FString FTransaction_Sequence::ToJson() +{ + FJsonBuilder Json = FJsonBuilder(); + + Json.AddInt("chainId", ChainId); + Json.AddString("from", "0x" + From.ToHex()); + Json.AddString("to", "0x" + To.ToHex()); + + if(this->Value.IsSet()) Json.AddString("value", this->Value.GetValue()); + + return Json.ToString(); +} + +TransactionID FTransaction_Sequence::ID() +{ + FUnsizedData Data = StringToUTF8(ToJson()); + return GetKeccakHash(Data).ToHex(); +} + +FString USequenceWallet::Url(const FString& Name) const +{ + return this->Hostname + this->Path + Name; +} + +void USequenceWallet::SendRPC(const FString& Url, const FString& Content, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + URequestHandler* RequestHandler = NewObject(); + + RequestHandler->PrepareRequest() + ->WithUrl(Url) + ->WithHeader("Content-type", "application/json") + ->WithHeader("Authorization", "Bearer " + this->Credentials.GetIDToken()) + ->WithVerb("POST") + ->WithContentAsString(Content); + + RequestHandler->ProcessAndThen(*SequenceRPCManager->Validator, OnSuccess, OnFailure); +} + USequenceWallet::USequenceWallet() { this->Indexer = NewObject(); From 4067f83b3285e3b8b1c4ee08955a1e981ed6d1be Mon Sep 17 00:00:00 2001 From: caballoninja Date: Mon, 13 Jan 2025 16:55:21 -0300 Subject: [PATCH 18/48] Parameters fix --- .../SequencePlugin/Private/RequestHandler.cpp | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp index 1356c3873..e258bb917 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp @@ -195,7 +195,7 @@ void URequestHandler::ProcessAndThen(const TSuccessCallback& OnSucc });//lambda } -void URequestHandler::ProcessAndThen(UResponseSignatureValidator& Validator, TFunction OnSuccess, FFailureCallback OnFailure) const +void URequestHandler::ProcessAndThen(UResponseSignatureValidator& Validator, TFunction& OnSuccess, FFailureCallback& OnFailure) const { if (Validator.HasFoundTamperedResponse()) { @@ -220,6 +220,33 @@ void URequestHandler::ProcessAndThen(UResponseSignatureValidator& Validator, TFu } } else + { + if (Response.IsValid()) + { + OnFailure(FSequenceError(RequestFail, "Request is invalid: " + Response->GetContentAsString())); + } + else + { + OnFailure(FSequenceError(RequestFail, "Request failed: No response received!")); + } + } + }); +} + +void URequestHandler::ProcessAndThen(TSuccessCallback& OnSuccess, + const FFailureCallback& OnFailure) const +{ + Process().BindLambda([OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) + { + if(bWasSuccessful) + { + OnSuccess(Response); + } + else + { + if(!Response.IsValid()) + OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); + else { if (Response.IsValid()) OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); From ab419bbff6f317b8c80cef517eb94c7cc44818a8 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 14 Feb 2025 11:20:45 -0500 Subject: [PATCH 19/48] Added Etherlink mainnet and testnet and XR1 mainnet --- .../SequencePlugin/Public/Util/SequenceSupport.h | 15 +++++++++++++++ .../SequencePlugin/Public/Util/Structs/BE_Enums.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h index 36e3a8e6a..9640efc1e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h @@ -56,6 +56,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FIdName(56,TEXT("bsc")), FIdName(100,TEXT("gnosis")), FIdName(137,TEXT("polygon")), + FIdName(273,TEXT("xr1")), FIdName(1101,TEXT("polygon-zkevm")), FIdName(1284,TEXT("moonbeam")), FIdName(1868,TEXT("soneium")), @@ -68,6 +69,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FIdName(33139,TEXT("apechain")), FIdName(42161,TEXT("arbitrum")), FIdName(42170,TEXT("arbitrum-nova")), + FIdName(42793,TEXT("etherlink")), FIdName(43114,TEXT("avalanche")), FIdName(81457,TEXT("blast")), FIdName(660279,TEXT("xai")), @@ -87,6 +89,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FIdName(62850,TEXT("laos-sigma-testnet")), FIdName(80002,TEXT("amoy")), FIdName(84532,TEXT("base-sepolia")), + FIdName(128123,TEXT("etherlink-testnet")), FIdName(421614,TEXT("arbitrum-sepolia")), FIdName(11155111,TEXT("sepolia")), FIdName(11155420,TEXT("optimism-sepolia")), @@ -118,6 +121,8 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FIdName(1868,TEXT("Soneium")), FIdName(40,TEXT("Telos")), FIdName(1284,TEXT("Moonbeam")), + FIdName(42793, TEXT("Etherlink")), + FIdName(273, TEXT("XR1")), FIdName(13473,TEXT("Immutable Testnet")), FIdName(97,TEXT("BNB Smart Chain Testnet")), @@ -140,6 +145,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FIdName(7672,TEXT("Root Network Porcini Testnet")), FIdName(41,TEXT("Telos Testnet")), FIdName(1287,TEXT("Moonbase Alpha")), + FIdName(128123,TEXT("Etherlink Testnet")), }; static inline TMap NetworkNameToIdMap = { @@ -165,6 +171,8 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FNameId(TEXT("soneium"),1868), FNameId(TEXT("telos"),40), FNameId(TEXT("moonbeam"),1284), + FNameId(TEXT("etherlink"),42793), + FNameId(TEXT("xr1"),273), FNameId(TEXT("immutable-testnet"),13473), FNameId(TEXT("bnbsmartchaintestnet"),97), @@ -187,6 +195,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FNameId(TEXT("rootnet-porcini"),7672), FNameId(TEXT("telos-testnet"), 41), FNameId(TEXT("moonbase-alpha"),1287), + FNameId(TEXT("etherlink-testnet"),128123), }; static inline TMap NetworkEnumToIdMap = { @@ -212,6 +221,8 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject {ENetwork::Soneium, 1868}, {ENetwork::Telos, 40}, {ENetwork::Moonbeam, 1284}, + {ENetwork::Etherlink, 42793}, + {ENetwork::XR1, 273}, {ENetwork::ImmutableTestnet, 13473}, {ENetwork::BNBSmartChainTestnet, 97}, @@ -234,6 +245,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject {ENetwork::RootPorcini, 7672}, {ENetwork::TelosTestnet, 41}, {ENetwork::MoonbaseAlpha, 1287}, + {ENetwork::EtherlinkTestnet, 128123}, }; static inline TMap NetworkEnumToNameMap = { @@ -259,6 +271,8 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject {ENetwork::Soneium, TEXT("Soneium")}, {ENetwork::Telos, TEXT("Telos")}, {ENetwork::Moonbeam, TEXT("Moonbeam")}, + {ENetwork::Etherlink, TEXT("Etherlink")}, + {ENetwork::XR1, TEXT("XR1")}, {ENetwork::ImmutableTestnet, TEXT("Immutable Testnet")}, {ENetwork::BNBSmartChainTestnet, TEXT("BNB Smart Chain Testnet")}, @@ -281,6 +295,7 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject {ENetwork::RootPorcini, TEXT("Root Network Porcini Testnet")}, {ENetwork::TelosTestnet, TEXT("Telos Testnet")}, {ENetwork::MoonbaseAlpha, TEXT("Moonbase Alpha")}, + {ENetwork::EtherlinkTestnet, TEXT("Etherlink Testnet")}, }; public: diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/Structs/BE_Enums.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/Structs/BE_Enums.h index dcb9979b6..a5e026022 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/Structs/BE_Enums.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/Structs/BE_Enums.h @@ -38,6 +38,8 @@ enum ENetwork Soneium UMETA(DisplayName = "Soneium"), Telos UMETA(DisplayName = "Telos"), Moonbeam UMETA(DisplayName = "Moonbeam"), + Etherlink UMETA(DisplayName = "Etherlink"), + XR1 UMETA(DisplayName = "XR1"), ImmutableTestnet UMETA(DisplayName = "Immutable Testnet"), BNBSmartChainTestnet UMETA(DisplayName = "BNB Smart Chain Testnet"), @@ -60,4 +62,5 @@ enum ENetwork RootPorcini UMETA(DisplayName = "Root Network Porcini Testnet"), TelosTestnet UMETA(DisplayName = "Telos Testnet"), MoonbaseAlpha UMETA(DisplayName = "Moonbase Alpha"), + EtherlinkTestnet UMETA(DisplayName = "Etherlink Testnet"), }; \ No newline at end of file From cae63e9c04b63e4673054054c628675068a379ac Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 10 Mar 2025 14:25:19 -0400 Subject: [PATCH 20/48] beginning sardine --- .../Marketplace/Sardine/SardineCheckout.cpp | 4 ++ .../Marketplace/Sardine/SardineCheckout.h | 37 +++++++++++++++++++ .../Sardine/Structs/SardineFiatCurrency.h | 18 +++++++++ .../Sardine/Structs/SardinePaymentOption.h | 22 +++++++++++ .../Sardine/Structs/SardinePaymentType.h | 15 ++++++++ .../Sardine/Structs/SardineQuote.h | 27 ++++++++++++++ .../Sardine/Structs/SardineQuoteType.h | 11 ++++++ .../Sardine/Structs/SardineToken.h | 19 ++++++++++ 8 files changed, 153 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentType.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuoteType.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp new file mode 100644 index 000000000..00a862bb1 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -0,0 +1,4 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + + +#include "Marketplace/Sardine/SardineCheckout.h" diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h new file mode 100644 index 000000000..9fa301ee0 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -0,0 +1,37 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Structs/SardineFiatCurrency.h" +#include "Structs/SardinePaymentType.h" +#include "Structs/SardineQuote.h" +#include "Structs/SardineQuoteType.h" +#include "Structs/SardineToken.h" +#include "UObject/Object.h" +#include "Util/Async.h" +#include "SardineCheckout.generated.h" + +/** + * + */ +UCLASS() +class SEQUENCEPLUGIN_API USardineCheckout : public UObject +{ + GENERATED_BODY() + +public: + void CheckSardineWhiteListStatus(FString Address, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetQuote(FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType = Credit, + TOptional QuotedCurrency = TOptional(), + ESardineQuoteType QuoteType = Buy, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetClientToken(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void OnRamp(FString ClientToken); + + void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); + + +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h new file mode 100644 index 000000000..939f105ed --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h @@ -0,0 +1,18 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardinePaymentOption.h" +#include "SardineFiatCurrency.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineFiatCurrency +{ + GENERATED_USTRUCT_BODY() + +public: + FString CurrencyCode; + FString Name; + FString CurrencySymbol; + TArray PaymentOptions; + TArray SupportedCountries; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h new file mode 100644 index 000000000..4428cb1b4 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h @@ -0,0 +1,22 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardinePaymentOption.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardinePaymentOption +{ + GENERATED_USTRUCT_BODY() + +public: + FString Name; + double DailyLimit; + double WeeklyLimit; + double MonthlyLimit; + double MaxAmount; + double MinAmount; + TArray SubTypes; + FString Type; + FString SubType; + FString ProcessingTime; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentType.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentType.h new file mode 100644 index 000000000..72a74942a --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentType.h @@ -0,0 +1,15 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardinePaymentType.generated.h" + +UENUM(BlueprintType) +enum ESardinePaymentType +{ + Ach UMETA(DisplayName = "ACH"), + Debit UMETA(DisplayName = "DEBIT"), + Credit UMETA(DisplayName = "CREDIT"), + Us_Debit UMETA(DisplayName = "US_DEBIT"), + International_Debit UMETA(DisplayName = "INTERNATIONAL_DEBIT"), + International_Credit UMETA(DisplayName = "INTERNATIONAL_CREDIT"), +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h new file mode 100644 index 000000000..7da799651 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h @@ -0,0 +1,27 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineQuote.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineQuote +{ + GENERATED_USTRUCT_BODY() + +public: + double Quantity; + FString Network; + FString AssetType; + double Total; + FString Currency; + FString ExpiresAt; + FString PaymentType; + double Price; + double SubTotal; + double TransactionFee; + double NetworkFee; + bool HighNetworkFee; + double MinTransactionValue; + double MaxTransactionValue; + FString LiquidityProvider; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuoteType.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuoteType.h new file mode 100644 index 000000000..39de89e1f --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuoteType.h @@ -0,0 +1,11 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineQuoteType.generated.h" + +UENUM(BlueprintType) +enum ESardineQuoteType +{ + Buy UMETA(DisplayName = "BUY"), + Sell UMETA(DisplayName = "SELL"), +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h new file mode 100644 index 000000000..412f7c3bb --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h @@ -0,0 +1,19 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineToken.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineToken +{ + GENERATED_USTRUCT_BODY() + +public: + FString Network; + FString AssetSymbol; + FString AssetName; + FString ChainID; + FString TokenName; + FString Token; + FString TokenAddress; +}; \ No newline at end of file From 015bed2deb2e46b442d82c88d19b4a059abe6d37 Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 10 Mar 2025 14:56:58 -0400 Subject: [PATCH 21/48] More data types --- .../Marketplace/Sardine/SardineCheckout.h | 15 +++++++++ .../Sardine/Structs/SardineNFTCheckout.h | 15 +++++++++ .../Sardine/Structs/SardineOrder.h | 33 +++++++++++++++++++ .../Marketplace/Structs/AdditionalFee.h | 14 ++++++++ 4 files changed, 77 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineOrder.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index 9fa301ee0..caaa238f0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -3,11 +3,16 @@ #pragma once #include "CoreMinimal.h" +#include "Marketplace/Structs/AdditionalFee.h" +#include "Marketplace/Structs/SeqCollectibleOrder.h" #include "Structs/SardineFiatCurrency.h" +#include "Structs/SardineNFTCheckout.h" #include "Structs/SardinePaymentType.h" #include "Structs/SardineQuote.h" #include "Structs/SardineQuoteType.h" #include "Structs/SardineToken.h" +#include "Types/ERC1155SaleContract.h" +#include "Types/ERC721SaleContract.h" #include "UObject/Object.h" #include "Util/Async.h" #include "SardineCheckout.generated.h" @@ -33,5 +38,15 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutToken(TArray Orders, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + FString CheckoutURL(FSardineNFTCheckout Token); + + void Checkout(FSardineNFTCheckout Token); }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h new file mode 100644 index 000000000..9da032896 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h @@ -0,0 +1,15 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineNFTCheckout.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineNFTCheckout +{ + GENERATED_USTRUCT_BODY() + +public: + FString Token; + FString ExpiresAt; + FString OrderID; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineOrder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineOrder.h new file mode 100644 index 000000000..f9c9031af --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineOrder.h @@ -0,0 +1,33 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineOrder.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineOrder +{ + GENERATED_USTRUCT_BODY() + +public: + FString ID; + FString CreatedAt; + FString ReferenceID; + FString Status; + FString FiatCurrency; + double FiatExchangeRateUSD; + FString TransactionID; + FString ExpiresAt; + double Total; + double SubTotal; + double TransactionFee; + double NetworkFee; + FString PaymentCurrency; + FString PaymentMethodType; + FString TransactionType; + FString Name; + int Price; + FString ImageURL; + FString ContractAddress; + FString TransactionHash; + FString RecipientAddress; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h new file mode 100644 index 000000000..37f6bb678 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h @@ -0,0 +1,14 @@ +#pragma once + +#include "CoreMinimal.h" +#include "AdditionalFee.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FAdditionalFee +{ + GENERATED_USTRUCT_BODY() + +public: + FString Amount; + FString Receiver; +}; \ No newline at end of file From 4114d4ff0f3778589683f6e0ca8e93332c04a0d8 Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:34:52 -0400 Subject: [PATCH 22/48] Update SardineCheckout.h --- .../Public/Marketplace/Sardine/SardineCheckout.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index caaa238f0..deb9a3a40 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -7,6 +7,7 @@ #include "Marketplace/Structs/SeqCollectibleOrder.h" #include "Structs/SardineFiatCurrency.h" #include "Structs/SardineNFTCheckout.h" +#include "Structs/SardineOrder.h" #include "Structs/SardinePaymentType.h" #include "Structs/SardineQuote.h" #include "Structs/SardineQuoteType.h" @@ -44,7 +45,7 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); FString CheckoutURL(FSardineNFTCheckout Token); From 8740dc6badcb4d3fb1b000d87986ce3900a9b76e Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:51:33 -0400 Subject: [PATCH 23/48] sardine regions --- .../Marketplace/Sardine/SardineCheckout.h | 3 +++ .../Sardine/Structs/SardineRegion.h | 25 +++++++++++++++++++ .../Structs/SardineRegionPaymentMethod.h | 18 +++++++++++++ .../Sardine/Structs/SardineRegionState.h | 17 +++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index deb9a3a40..edd1f9d5f 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -11,6 +11,7 @@ #include "Structs/SardinePaymentType.h" #include "Structs/SardineQuote.h" #include "Structs/SardineQuoteType.h" +#include "Structs/SardineRegion.h" #include "Structs/SardineToken.h" #include "Types/ERC1155SaleContract.h" #include "Types/ERC721SaleContract.h" @@ -46,6 +47,8 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetSupportedRegions(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); FString CheckoutURL(FSardineNFTCheckout Token); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h new file mode 100644 index 000000000..4e8b71bce --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h @@ -0,0 +1,25 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineRegionPaymentMethod.h" +#include "SardineRegionState.h" +#include "SardineRegion.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineRegion +{ + GENERATED_USTRUCT_BODY() + +public: + FString CountryCode; + bool IsAllowedOnRamp; + bool IsAllowedOnNFT; + TArray IsBasicKycRequired; + TArray IsSSNRequired; + FString Name; + FString CurrencyCode; + bool IsPayrollSupported; + TArray SupportedDocuments; + TArray PaymentMethods; + TArray States; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h new file mode 100644 index 000000000..dc3743ff4 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h @@ -0,0 +1,18 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineRegionPaymentMethod.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineRegionPaymentMethod +{ + GENERATED_USTRUCT_BODY() + +public: + FString Name; + bool IsAllowedOnRamp; + bool IsAllowedOnNFT; + TArray SubTypes; + FString Type; + FString SubType; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h new file mode 100644 index 000000000..d0e671047 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h @@ -0,0 +1,17 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineRegionPaymentMethod.h" +#include "SardineRegionState.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineRegionState +{ + GENERATED_USTRUCT_BODY() + +public: + FString Code; + FString Name; + bool IsAllowedOnRamp; + bool IsAllowedOnNFT; +}; \ No newline at end of file From f9d27f723061232512d10996d70527eda4b38821 Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:03:10 -0400 Subject: [PATCH 24/48] better signature --- .../Public/Marketplace/Sardine/SardineCheckout.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index edd1f9d5f..24be5a8aa 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -28,6 +28,8 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject GENERATED_BODY() public: + const FString SequenceMarketplaceV2Contract = "0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"; + void CheckSardineWhiteListStatus(FString Address, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void SardineGetQuote(FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType = Credit, @@ -42,9 +44,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetNFTCheckoutToken(TArray Orders, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, FString CollectionAddress, u_long TokenID, u_long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); - void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, FString CollectionAddress, u_long TokenID, u_long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); From 95d8ddf8adf2c94e418855d11bab23b31196a07a Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:27:43 -0400 Subject: [PATCH 25/48] full api --- .../Public/Marketplace/Sardine/SardineCheckout.h | 8 ++++++++ .../Sardine/Structs/SardineEnabledToken.h | 14 ++++++++++++++ .../Sardine/Structs/SardineSupportedToken.h | 14 ++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledToken.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedToken.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index 24be5a8aa..c08d59f88 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "Marketplace/Structs/AdditionalFee.h" #include "Marketplace/Structs/SeqCollectibleOrder.h" +#include "Structs/SardineEnabledToken.h" #include "Structs/SardineFiatCurrency.h" #include "Structs/SardineNFTCheckout.h" #include "Structs/SardineOrder.h" @@ -12,6 +13,7 @@ #include "Structs/SardineQuote.h" #include "Structs/SardineQuoteType.h" #include "Structs/SardineRegion.h" +#include "Structs/SardineSupportedToken.h" #include "Structs/SardineToken.h" #include "Types/ERC1155SaleContract.h" #include "Types/ERC721SaleContract.h" @@ -51,6 +53,12 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void SardineGetSupportedRegions(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetSupportedFiatCurrencies(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetSupportedTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetEnabledTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); FString CheckoutURL(FSardineNFTCheckout Token); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledToken.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledToken.h new file mode 100644 index 000000000..12ab19d3e --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledToken.h @@ -0,0 +1,14 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineToken.h" +#include "SardineEnabledToken.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineEnabledToken : public FSardineToken +{ + GENERATED_USTRUCT_BODY() + +public: + +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedToken.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedToken.h new file mode 100644 index 000000000..7d4f5c1da --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedToken.h @@ -0,0 +1,14 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineToken.h" +#include "SardineSupportedToken.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineSupportedToken : public FSardineToken +{ + GENERATED_USTRUCT_BODY() + +public: + +}; \ No newline at end of file From 047e5cdd89273e16a6b0de493b078b38f202892b Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Thu, 13 Mar 2025 16:28:48 -0400 Subject: [PATCH 26/48] sardine quote --- .../Marketplace/Sardine/SardineCheckout.cpp | 102 ++++++++++++++++++ .../Sardine/Structs/SardineGetQuoteArgs.cpp | 4 + .../Marketplace/Sardine/SardineCheckout.h | 86 ++++++++++++++- .../Sardine/Structs/SardineGetQuoteArgs.h | 47 ++++++++ .../Sardine/Structs/SardineGetQuoteResponse.h | 31 ++++++ .../Sardine/Structs/SardineQuote.h | 19 ++++ 6 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/Structs/SardineGetQuoteArgs.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteArgs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteResponse.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 00a862bb1..b1ede28de 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -2,3 +2,105 @@ #include "Marketplace/Sardine/SardineCheckout.h" + +#include "ConfigFetcher.h" +#include "HttpModule.h" +#include "Interfaces/IHttpResponse.h" +#include "Marketplace/Sardine/Structs/SardineGetQuoteArgs.h" +#include "Marketplace/Sardine/Structs/SardineGetQuoteResponse.h" +#include "Util/Log.h" + +FString USardineCheckout::Url(const FString& EndPoint) const +{ + return _baseUrl + "/" + EndPoint; +} + +void USardineCheckout::HTTPPost(const FString& Endpoint, const FString& Args, + const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + const FString RequestURL = this->Url(Endpoint); + + const TSharedRef HTTP_Post_Req = FHttpModule::Get().CreateRequest(); + + FString AccessKey = UConfigFetcher::GetConfigVar("ProjectAccessKey"); + if (AccessKey.IsEmpty()) + { + UE_LOG(LogTemp, Error, TEXT("AccessKey is empty! Failed to set HTTP header.")); + return; + } + + HTTP_Post_Req->SetVerb("POST"); + HTTP_Post_Req->SetHeader(TEXT("Content-Type"), TEXT("application/json")); + HTTP_Post_Req->SetHeader(TEXT("Accept"), TEXT("application/json")); + + + HTTP_Post_Req->SetHeader(TEXT("X-Access-Key"), *AccessKey); + HTTP_Post_Req->SetTimeout(30); + HTTP_Post_Req->SetURL(RequestURL); + HTTP_Post_Req->SetContentAsString(Args); + + FString CurlCommand = FString::Printf( + TEXT("curl -X %s \"%s\" -H \"Content-Type: application/json\" -H \"Accept: application/json\" -H \"X-Access-Key: %s\" --data \"%s\""), + *HTTP_Post_Req->GetVerb(), + *HTTP_Post_Req->GetURL(), + *HTTP_Post_Req->GetHeader("X-Access-Key"), + *FString(UTF8_TO_TCHAR(HTTP_Post_Req->GetContent().GetData())).Replace(TEXT("\""), TEXT("\\\"")) + ); + + SEQ_LOG_EDITOR(Log, TEXT("%s"), *CurlCommand); + + + HTTP_Post_Req->OnProcessRequestComplete().BindLambda([OnSuccess, OnFailure](const FHttpRequestPtr& Request, FHttpResponsePtr Response, const bool bWasSuccessful) + { + if (bWasSuccessful) + { + const FString Content = Response->GetContentAsString(); + UE_LOG(LogTemp, Display, TEXT("Response: %s"), *Content); + OnSuccess(Content); + } + else + { + if (Request.IsValid() && Response.IsValid()) + { + const FString ErrorMessage = Response->GetContentAsString(); + UE_LOG(LogTemp, Error, TEXT("Request failed: %s"), *ErrorMessage); + OnFailure(FSequenceError(RequestFail, "Request failed: " + ErrorMessage)); + } + else + { + UE_LOG(LogTemp, Error, TEXT("Request failed: Invalid Request Pointer")); + OnFailure(FSequenceError(RequestFail, "Request failed: Invalid Request Pointer")); + } + } + }); + + // Process the request + HTTP_Post_Req->ProcessRequest(); +} + +void USardineCheckout::SardineGetQuote(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString WalletAddress, FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType, + TOptional QuotedCurrency, ESardineQuoteType QuoteType) +{ + const FString Endpoint = "SardineGetQuote"; + + FSardineGetQuoteArgs Args { + Token.AssetSymbol, + Token.Network, + Amount, + QuotedCurrency.IsSet() ? QuotedCurrency->CurrencySymbol : "", + PaymentType, + QuoteType, + WalletAddress + }; + + HTTPPost(Endpoint, BuildArgs(Args), [this, OnSuccess](const FString& Content) + { + const FSardineGetQuoteResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Quote); + }, OnFailure); +} + +void USardineCheckout::SardineGetClientToken(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +{ + +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/Structs/SardineGetQuoteArgs.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/Structs/SardineGetQuoteArgs.cpp new file mode 100644 index 000000000..49d4dc7e5 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/Structs/SardineGetQuoteArgs.cpp @@ -0,0 +1,4 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + + +#include "Marketplace/Sardine/Structs/SardineGetQuoteArgs.h" diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index c08d59f88..da882fa76 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -29,14 +29,49 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject { GENERATED_BODY() + const FString _sardineCheckoutUrl = + "https://sardine-checkout.sequence.info?api_url=https://sardine-api.sequence.info&client_token="; + + const FString _sardineSandboxCheckoutUrl = + "https://sardine-checkout-sandbox.sequence.info?api_url=https://sardine-api-sandbox.sequence.info&client_token="; + + const FString _sardineCheckoutUrlSuffix = "&show_features=true"; + + const FString _devUrl = "https://dev-api.sequence.app/rpc/API"; + const FString _prodUrl = "https://api.sequence.app/rpc/API"; + FString _baseUrl = _prodUrl; + + + FString Url(const FString& EndPoint) const; + public: + //public functions + + /* + Here we take in text and convert it to a Struct of type T if possible + @return a Struct of type T + + NOTE: Because unreal doesn't support nested TArrays and TMaps I had to use special implementations + for some data structures inorder for them to parse properly + */ + template < typename T > T BuildResponse(FString Text); + + /* + Here we take in a struct and convert it straight into a json object String + @Param (T) Struct_in the struct we are converting to a json object string + @Return the JSON Object String + */ + template < typename T> FString BuildArgs(T StructIn); + void HTTPPost(const FString& Endpoint, const FString& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& + OnFailure) const; + const FString SequenceMarketplaceV2Contract = "0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"; void CheckSardineWhiteListStatus(FString Address, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void SardineGetQuote(FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType = Credit, + void SardineGetQuote(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString WalletAddress, FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType = Credit, TOptional QuotedCurrency = TOptional(), - ESardineQuoteType QuoteType = Buy, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + ESardineQuoteType QuoteType = Buy); void SardineGetClientToken(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); @@ -64,3 +99,50 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void Checkout(FSardineNFTCheckout Token); }; + +template < typename T> FString USardineCheckout::BuildArgs(T StructIn) +{ + FString Result = "[FAILED TO PARSE]"; + if (StructIn.customGetter) + { + Result = StructIn.GetArgs(); + } + else + { + if (!FJsonObjectConverter::UStructToJsonObjectString(StructIn, Result)) + { + UE_LOG(LogTemp, Display, TEXT("Failed to convert specified UStruct to a json object\n")); + } + } + return Result; +} + +//generic +template T USardineCheckout::BuildResponse(const FString Text) +{ + //Take the FString and convert it to a JSON object first! + TSharedPtr JSON_Step; + //Then take the json object we make and convert it to a USTRUCT of type T then we return that! + T Ret_Struct; + + if (!FJsonSerializer::Deserialize(TJsonReaderFactory<>::Create(Text), JSON_Step)) + { + UE_LOG(LogTemp, Display, TEXT("Failed to convert String: %s to Json object"), *Text); + return T(); + } + //this next line with throw an exception in null is used as an entry in json attributes! we need to remove null entries + if (Ret_Struct.customConstructor) + {//use the custom constructor! + Ret_Struct.construct(*JSON_Step.Get()); + } + else + {//use unreal parsing! + if (!FJsonObjectConverter::JsonObjectToUStruct(JSON_Step.ToSharedRef(), &Ret_Struct)) + { + UE_LOG(LogTemp, Display, TEXT("Failed to convert Json Object: %s to USTRUCT of type T"), *Text); + return T(); + } + } + Ret_Struct.Setup(*JSON_Step.Get());//now for the edge cases we will manually inject the data where it needs to be! + return Ret_Struct; +} \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteArgs.h new file mode 100644 index 000000000..23fcc27c6 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteArgs.h @@ -0,0 +1,47 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardinePaymentType.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "UObject/Object.h" +#include "SardineGetQuoteArgs.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetQuoteArgs +{ + GENERATED_USTRUCT_BODY() + +private: + inline static const FString DefaultCurrency = "USD"; + +public: + FString AssetType; + FString Network; + u_long Total; + FString Currency; + ESardinePaymentType PaymentType; + ESardineQuoteType QuoteType; + FString WalletAddress; + + bool customGetter = true; + + FString GetArgs() + { + FJsonBuilder Builder; + + Builder.AddString(TEXT("assetType"), AssetType); + Builder.AddString(TEXT("network"), Network); + Builder.AddField(TEXT("total"), FString::SanitizeFloat(Total)); + Builder.AddString(TEXT("currency"), Currency == "" ? DefaultCurrency : Currency); + Builder.AddString(TEXT("paymentType"), UEnum::GetValueAsString(PaymentType).ToLower()); + Builder.AddString(TEXT("quoteType"), UEnum::GetValueAsString(QuoteType).ToLower()); + Builder.AddString(TEXT("walletAddress"), WalletAddress); + + return Builder.ToString(); + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteResponse.h new file mode 100644 index 000000000..871f02dbf --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteResponse.h @@ -0,0 +1,31 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardinePaymentType.h" +#include "SardineQuote.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "UObject/Object.h" +#include "SardineGetQuoteResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetQuoteResponse +{ + GENERATED_USTRUCT_BODY() + +public: + FSardineQuote Quote; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + const auto QuoteObject = json_in.GetObjectField(TEXT("quote")); + Quote.Setup(*QuoteObject); + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h index 7da799651..1b11f6f69 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineQuote.h @@ -24,4 +24,23 @@ struct SEQUENCEPLUGIN_API FSardineQuote double MinTransactionValue; double MaxTransactionValue; FString LiquidityProvider; + + void Setup(FJsonObject& json_in) + { + Quantity = json_in.GetNumberField(TEXT("quantity")); + Network = json_in.GetStringField(TEXT("network")); + AssetType = json_in.GetStringField(TEXT("assetType")); + Total = json_in.GetNumberField(TEXT("total")); + Currency = json_in.GetStringField(TEXT("currency")); + ExpiresAt = json_in.GetStringField(TEXT("expiresAt")); + PaymentType = json_in.GetStringField(TEXT("paymentType")); + Price = json_in.GetNumberField(TEXT("price")); + SubTotal = json_in.GetNumberField(TEXT("subTotal")); + TransactionFee = json_in.GetNumberField(TEXT("transactionFee")); + NetworkFee = json_in.GetNumberField(TEXT("networkFee")); + HighNetworkFee = json_in.GetBoolField(TEXT("highNetworkFee")); + MinTransactionValue = json_in.GetNumberField(TEXT("minTransactionValue")); + MaxTransactionValue = json_in.GetNumberField(TEXT("maxTransactionValue")); + LiquidityProvider = json_in.GetStringField(TEXT("liquidityProvider")); + } }; \ No newline at end of file From 0c8a9522ff645ee2f1852b561124876de31f9a1e Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 17 Mar 2025 12:59:30 -0400 Subject: [PATCH 27/48] sardine progress, need marketplace stuff --- .../Marketplace/Sardine/SardineCheckout.cpp | 61 ++++++++++++++++- .../Marketplace/Sardine/SardineCheckout.h | 9 ++- .../Structs/SardineGetNFTCheckoutTokenArgs.h | 67 +++++++++++++++++++ .../Sardine/Structs/SardineNFTCheckout.h | 10 +++ .../Sardine/Structs/SardinePaymentMethod.h | 14 ++++ .../Structs/SardinePaymentMethodTypeConfig.h | 33 +++++++++ 6 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethodTypeConfig.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index b1ede28de..6e9056404 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -6,6 +6,7 @@ #include "ConfigFetcher.h" #include "HttpModule.h" #include "Interfaces/IHttpResponse.h" +#include "Marketplace/Marketplace.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteArgs.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteResponse.h" #include "Util/Log.h" @@ -15,6 +16,22 @@ FString USardineCheckout::Url(const FString& EndPoint) const return _baseUrl + "/" + EndPoint; } +void USardineCheckout::SardineGetNFTCHeckoutToken(FSardineGetNFTCheckoutTokenArgs Args, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +{ + if(Args.TokenAddress == FAddress::New().ToHex()) + { + OnFailure(FSequenceError(InvalidArgument, "Sardine doesn't support native currency checkout; please choose a different payment token")); + return; + } + + HTTPPost("SardineGetNFTCheckoutToken", BuildArgs(Args), [this, OnSuccess](const FString& Content) + { + const FSardineNFTCheckout Response = this->BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + void USardineCheckout::HTTPPost(const FString& Endpoint, const FString& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const { @@ -78,8 +95,14 @@ void USardineCheckout::HTTPPost(const FString& Endpoint, const FString& Args, HTTP_Post_Req->ProcessRequest(); } +void USardineCheckout::CheckSardineWhiteListStatus(FString Address, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) +{ + +} + void USardineCheckout::SardineGetQuote(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString WalletAddress, FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType, - TOptional QuotedCurrency, ESardineQuoteType QuoteType) + TOptional QuotedCurrency, ESardineQuoteType QuoteType) { const FString Endpoint = "SardineGetQuote"; @@ -104,3 +127,39 @@ void USardineCheckout::SardineGetClientToken(TSuccessCallback OnSuccess { } + +void USardineCheckout::SardineGetNFTCheckoutToken(TArray Orders, long Quantity, + FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +{ + if(Orders.Num() < 1) + { + OnFailure(FSequenceError(InvalidArgument, "Orders must contain at least one collectible")); + return; + } + + if(Orders[0].Order.PriceCurrencyAddress == FAddress::New().ToHex()) + { + OnFailure(FSequenceError(InvalidArgument, "Sardine doesn't support native currency checkout; please choose a different payment token")); + return; + } + + //TODO Generate steps from checkout +} + +void USardineCheckout::SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, FString CollectionAddress, + long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, + FString RecipientAddress, TArray data, TArray Proof) +{ + if(Amount < 1) + { + OnFailure(FSequenceError(InvalidArgument, "Amount must be greater than 0")); + return; + } + + UMarketplace* Marketplace = NewObject(); + + + + FSeqTokenMetaData metaData = +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index da882fa76..5c32f3a28 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -7,6 +7,7 @@ #include "Marketplace/Structs/SeqCollectibleOrder.h" #include "Structs/SardineEnabledToken.h" #include "Structs/SardineFiatCurrency.h" +#include "Structs/SardineGetNFTCheckoutTokenArgs.h" #include "Structs/SardineNFTCheckout.h" #include "Structs/SardineOrder.h" #include "Structs/SardinePaymentType.h" @@ -43,6 +44,8 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject FString Url(const FString& EndPoint) const; + + void SardineGetNFTCHeckoutToken(FSardineGetNFTCheckoutTokenArgs Args, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); public: //public functions @@ -79,11 +82,11 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutToken(TArray Orders, u_long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutToken(TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, FString CollectionAddress, u_long TokenID, u_long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); + void SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); - void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, FString CollectionAddress, u_long TokenID, u_long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); + void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h new file mode 100644 index 000000000..0df7c1d85 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h @@ -0,0 +1,67 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardinePaymentMethodTypeConfig.h" +#include "SardinePaymentType.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "UObject/Object.h" +#include "SardineGetNFTCheckoutTokenArgs.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetNFTCheckoutTokenArgs +{ + GENERATED_USTRUCT_BODY() + +public: + FString ReferenceId; + uint ExpiresIn; + FSardinePaymentMethodTypeConfig PaymentMethodTypeConfig; + FString Name; + FString ImageUrl; + FString Network; + FString RecipientAddress; + FString ContractAddress; + FString Platform; + FString ExecutionType; + FString BlockchainNftId; + long Quantity; + long Decimals; + FString TokenAmount; + FString TokenAddress; + FString TokenSymbol; + long TokenDecimals; + FString CallData; + + bool customGetter = true; + + FString GetArgs() + { + FJsonBuilder Builder; + + Builder.AddString(TEXT("ReferenceId"), ReferenceId); + Builder.AddInt(TEXT("ExpiresIn"), ExpiresIn); + Builder.AddField(TEXT("PaymentMethodTypeConfig"), PaymentMethodTypeConfig.GetArgs()); + Builder.AddString(TEXT("Name"), Name); + Builder.AddString(TEXT("ImageUrl"), ImageUrl); + Builder.AddString(TEXT("Network"), Network); + Builder.AddString(TEXT("RecipientAddress"), RecipientAddress); + Builder.AddString(TEXT("ContractAddress"), ContractAddress); + Builder.AddString(TEXT("Platform"), Platform); + Builder.AddString(TEXT("ExecutionType"), ExecutionType); + Builder.AddString(TEXT("BlockchainNftId"), BlockchainNftId); + Builder.AddInt(TEXT("Quantity"), Quantity); + Builder.AddInt(TEXT("Decimals"), Decimals); + Builder.AddString(TEXT("TokenAmount"), TokenAmount); + Builder.AddString(TEXT("TokenAddress"), TokenAddress); + Builder.AddString(TEXT("TokenSymbol"), TokenSymbol); + Builder.AddInt(TEXT("TokenDecimals"), TokenDecimals); + Builder.AddString(TEXT("CallData"), CallData); + + return Builder.ToString(); + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h index 9da032896..5759d1067 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineNFTCheckout.h @@ -12,4 +12,14 @@ struct SEQUENCEPLUGIN_API FSardineNFTCheckout FString Token; FString ExpiresAt; FString OrderID; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + Token = json_in.GetStringField(TEXT("token")); + ExpiresAt = json_in.GetStringField(TEXT("expiresAt")); + OrderID = json_in.GetStringField(TEXT("orderID")); + } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h new file mode 100644 index 000000000..746225b32 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h @@ -0,0 +1,14 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardinePaymentMethod.generated.h" + +UENUM(BlueprintType) +enum ESardinePaymentMethod +{ + Us_Debit UMETA(DisplayName = "US_DEBIT"), + Us_Credit UMETA(DisplayName = "US_CREDIT"), + International_Debit UMETA(DisplayName = "INTERNATIONAL_DEBIT"), + International_Credit UMETA(DisplayName = "INTERNATIONAL_CREDIT"), + Ach UMETA(DisplayName = "ACH"), +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethodTypeConfig.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethodTypeConfig.h new file mode 100644 index 000000000..672aa346a --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethodTypeConfig.h @@ -0,0 +1,33 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardinePaymentMethod.h" +#include "Util/JsonBuilder.h" +#include "SardinePaymentMethodTypeConfig.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardinePaymentMethodTypeConfig +{ + GENERATED_USTRUCT_BODY() + +public: + TArray Enabled; + ESardinePaymentMethod DefaultPaymentMethod; + + bool customGetter = true; + + FString GetArgs() + { + FJsonBuilder Builder; + + FJsonArray Array = Builder.AddArray("enabled"); + for(const ESardinePaymentMethod Method : Enabled) + { + Array.AddString(UEnum::GetValueAsString(Method).ToLower()); + } + Builder = *Array.EndArray(); + Builder.AddString(TEXT("defaultPaymentMethod"), UEnum::GetValueAsString(DefaultPaymentMethod).ToLower()); + + return Builder.ToString(); + } +}; \ No newline at end of file From 8565e7e963247002eb2a16974f3d778a65ad0eec Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 17 Mar 2025 14:17:16 -0400 Subject: [PATCH 28/48] Added get collectible to marketplace --- .../Source/SequencePlugin/Private/Errors.cpp | 8 +- .../Private/Marketplace/Marketplace.cpp | 14 ++ .../Marketplace/Sardine/SardineCheckout.cpp | 4 +- .../Private/Sequence/SequenceAPI.cpp | 126 +++++++++--------- .../Private/SequenceAuthenticator.cpp | 2 +- .../Private/SequenceRPCManager.cpp | 79 ++++++++--- .../Private/SequenceRPCManager.h | 18 ++- .../Source/SequencePlugin/Public/Errors.h | 7 +- .../Public/Marketplace/Marketplace.h | 10 ++ .../Sardine/Structs/SardinePaymentMethod.h | 10 +- .../Structs/SeqGetCollectibleArgs.h | 33 +++++ .../Structs/SeqGetCollectibleReturn.h | 28 ++++ .../Public/Sequence/SequenceAPI.h | 10 ++ .../Public/Sequence/SequenceResponseIntent.h | 53 ++++++++ 14 files changed, 305 insertions(+), 97 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleArgs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleReturn.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Errors.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Errors.cpp index ffa454c04..d0ba089bd 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Errors.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Errors.cpp @@ -1,6 +1,8 @@ // Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. #include "Errors.h" -FSequenceError::FSequenceError(const EErrorType Type, const FString Message) : Message(Message), Type(Type) -{ -} +FSequenceError::FSequenceError(const EErrorType Type, const FString& Message) : + Response(nullptr), Message(Message), Type(Type) { } + +FSequenceError::FSequenceError(const EErrorType Type, const FHttpResponsePtr& Response, const FString& Message) : + Response(Response), Message(Message), Type(Type) { } \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Marketplace.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Marketplace.cpp index 216eabb1f..cc21c1ee5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Marketplace.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Marketplace.cpp @@ -8,8 +8,10 @@ #include "Util/Log.h" #include "ConfigFetcher.h" #include "HttpManager.h" +#include "Marketplace/Structs/SeqGetCollectibleArgs.h" #include "Marketplace/Structs/SeqGetCollectibleOrderArgs.h" #include "Marketplace/Structs/SeqGetCollectibleOrderReturn.h" +#include "Marketplace/Structs/SeqGetCollectibleReturn.h" #include "Marketplace/Structs/SeqGetFloorOrderArgs.h" #include "Marketplace/Structs/SeqGetOrderReturn.h" #include "Marketplace/Structs/SeqListCollectibleListingsArgs.h" @@ -231,6 +233,18 @@ void UMarketplace::ListAllCollectibleOffersWithHighestPricedOfferFirst( }, OnFailure); } +void UMarketplace::GetCollectible(const int64 ChainID, const FString& ContractAddress, const FString& TokenId, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +{ + const FString Endpoint = "GetCollectible"; + const FSeqGetCollectibleArgs Args = FSeqGetCollectibleArgs{ContractAddress, TokenId}; + HTTPPost(ChainID, Endpoint, BuildArgs(Args), [this, OnSuccess](const FString& Content) + { + const FSeqGetCollectibleReturn Response = this->BuildResponse(Content); + OnSuccess(Response.MetaData); + }, OnFailure); +} + void UMarketplace::GetLowestPriceOfferForCollectible( const int64 ChainID, const FString& ContractAddress, diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 6e9056404..7e137feb5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -159,7 +159,7 @@ void USardineCheckout::SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContr UMarketplace* Marketplace = NewObject(); + Marketplace->GetCollectibleOrder(); - - FSeqTokenMetaData metaData = + //FSeqTokenMetaData metaData = } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index be6e9a850..d4cf5f6f1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -13,61 +13,6 @@ #include "Transak.h" #include "SequenceRPCManager.h" -FTransaction_Sequence FTransaction_Sequence::Convert(const FTransaction_FE& Transaction_Fe) -{ - return FTransaction_Sequence{ - static_cast(Transaction_Fe.chainId), - FAddress::From(Transaction_Fe.From), - FAddress::From(Transaction_Fe.To), - Transaction_Fe.AutoGas == "" ? TOptional() : TOptional(Transaction_Fe.AutoGas), - Transaction_Fe.Nonce < 0 ? TOptional() : TOptional(static_cast(Transaction_Fe.Nonce)), - Transaction_Fe.Value == "" ? TOptional() : TOptional(Transaction_Fe.Value), - Transaction_Fe.CallData == "" ? TOptional() : TOptional(Transaction_Fe.CallData), - Transaction_Fe.TokenAddress == "" ? TOptional() : TOptional(Transaction_Fe.TokenAddress), - Transaction_Fe.TokenAmount == "" ? TOptional() : TOptional(Transaction_Fe.TokenAmount), - Transaction_Fe.TokenIds.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenIds), - Transaction_Fe.TokenAmounts.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenAmounts), - }; -} - -FString FTransaction_Sequence::ToJson() -{ - FJsonBuilder Json = FJsonBuilder(); - - Json.AddInt("chainId", ChainId); - Json.AddString("from", "0x" + From.ToHex()); - Json.AddString("to", "0x" + To.ToHex()); - - if(this->Value.IsSet()) Json.AddString("value", this->Value.GetValue()); - - return Json.ToString(); -} - -TransactionID FTransaction_Sequence::ID() -{ - FUnsizedData Data = StringToUTF8(ToJson()); - return GetKeccakHash(Data).ToHex(); -} - -FString USequenceWallet::Url(const FString& Name) const -{ - return this->Hostname + this->Path + Name; -} - -void USequenceWallet::SendRPC(const FString& Url, const FString& Content, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const -{ - URequestHandler* RequestHandler = NewObject(); - - RequestHandler->PrepareRequest() - ->WithUrl(Url) - ->WithHeader("Content-type", "application/json") - ->WithHeader("Authorization", "Bearer " + this->Credentials.GetIDToken()) - ->WithVerb("POST") - ->WithContentAsString(Content); - - RequestHandler->ProcessAndThen(*SequenceRPCManager->Validator, OnSuccess, OnFailure); -} - USequenceWallet::USequenceWallet() { this->Indexer = NewObject(); @@ -256,12 +201,6 @@ void USequenceWallet::GetIdToken(const FString& Nonce, const TSuccessCallbackCredentials.GetSessionWallet()->GetSessionId(); -} - - void USequenceWallet::ListSessions(const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) const { if (this->SequenceRPCManager) @@ -538,6 +477,71 @@ void USequenceWallet::SendTransaction(const TArray& Transactio } } +void USequenceWallet::GetLinkedWallets(const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + const FString& WalletAddress = this->GetWalletAddress(); + const FString& MessageToSign = "parent wallet with address " + WalletAddress; + + const TSuccessCallback OnSignatureSuccess = [this, WalletAddress, MessageToSign, OnSuccess, OnFailure](FSeqSignMessageResponse_Response SignatureResponse) + { + if (this->SequenceRPCManager) + { + const FString& ChainId = this->Credentials.GetNetworkString(); + FSeqLinkedWalletRequest Request; + Request.SignatureChainId = ChainId; + Request.ParentWalletAddress = WalletAddress; + Request.ParentWalletMessage = MessageToSign; + Request.ParentWalletSignature = SignatureResponse.Data.Signature; + + this->SequenceRPCManager->GetLinkedWallets(Request, OnSuccess, OnFailure); + } + else + { + OnFailure(FSequenceError(RequestFail, "SequenceRPCManager is not available.")); + } + }; + + const TFunction OnSignatureFailure = [OnFailure](FString Data, FSequenceError Err) + { + OnFailure(FSequenceError(RequestFail, "Error Parsing Response: " + Err.Message)); + }; + + this->SignMessage(MessageToSign, OnSignatureSuccess, OnFailure); +} + +void USequenceWallet::RemoveLinkedWallet(const FString& LinkedWalletAddress, const TFunction& OnSuccess, const FFailureCallback& OnFailure) const +{ + const FString& WalletAddress = this->GetWalletAddress(); + const FString& MessageToSign = "parent wallet with address " + WalletAddress + LinkedWalletAddress; + + const TSuccessCallback OnSignatureSuccess = [this, LinkedWalletAddress, WalletAddress, MessageToSign, OnSuccess, OnFailure](FSeqSignMessageResponse_Response SignatureResponse) + { + if (this->SequenceRPCManager) + { + const FString& ChainId = this->Credentials.GetNetworkString(); + FSeqLinkedWalletRequest Request; + Request.SignatureChainId = ChainId; + Request.ParentWalletAddress = WalletAddress; + Request.ParentWalletMessage = MessageToSign; + Request.ParentWalletSignature = SignatureResponse.Data.Signature; + Request.LinkedWalletAddress = LinkedWalletAddress; + + this->SequenceRPCManager->RemoveLinkedWallet(Request, OnSuccess, OnFailure); + } + else + { + OnFailure(FSequenceError(RequestFail, "SequenceRPCManager is not available.")); + } + }; + + const TFunction OnSignatureFailure = [OnFailure](FString Data, FSequenceError Err) + { + OnFailure(FSequenceError(RequestFail, "Error Parsing Response: " + Err.Message)); + }; + + this->SignMessage(MessageToSign, OnSignatureSuccess, OnFailure); +} + //Indexer Calls void USequenceWallet::Ping(const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceAuthenticator.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceAuthenticator.cpp index b51c38f0f..2df9441a1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceAuthenticator.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceAuthenticator.cpp @@ -920,4 +920,4 @@ FStoredCredentials_BE USequenceAuthenticator::GetStoredCredentials() const FCredentials_BE* Credentials = &CredData; const bool IsValid = this->GetStoredCredentials(Credentials); return FStoredCredentials_BE(IsValid, *Credentials); -} +} \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp index 604ec1303..40688639f 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp @@ -13,6 +13,7 @@ #include "Sequence/SequenceAPI.h" #include "Sequence/SequenceAuthResponseIntent.h" #include "Misc/DateTime.h" +#include "Util/Log.h" template FString USequenceRPCManager::GenerateIntent(T Data, TOptional CurrentTime) const { @@ -41,6 +42,8 @@ void USequenceRPCManager::SequenceRPC(const FString& Url, const FString& Content { UResponseSignatureValidator& RPCValidator = *Validator; + SEQ_LOG_EDITOR(Display, TEXT("%s - %s"), *Url, *Content); + NewObject() ->PrepareRequest() ->WithUrl(Url) @@ -55,6 +58,8 @@ void USequenceRPCManager::SequenceRPC(const FString& Url, const FString& Content void USequenceRPCManager::SequenceRPC(const FString& Url, const FString& Content, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const { + SEQ_LOG_EDITOR(Display, TEXT("%s - %s"), *Url, *Content); + NewObject() ->PrepareRequest() ->WithUrl(Url) @@ -71,31 +76,36 @@ void USequenceRPCManager::SendIntent(const FString& Url, TFunctionSequenceRPC(Url, ContentGenerator(TOptional()), [this, Url, ContentGenerator, OnSuccess, OnFailure](FHttpResponsePtr Response) { - UE_LOG(LogTemp, Display, TEXT("SUCCESS")); - UE_LOG(LogTemp, Display, TEXT("CONTENT")); - FString Content = UTF8ToString(FUnsizedData(Response.Get()->GetContent())); - UE_LOG(LogTemp, Display, TEXT("%s"), *Content); + const FString Content = UTF8ToString(FUnsizedData(Response.Get()->GetContent())); + const int32 Code = Response.Get()->GetResponseCode(); + + SEQ_LOG_EDITOR(Display, TEXT("%d %s"), Code, *Content); - if(Content.Contains("intent is invalid: intent expired") || Content.Contains("intent is invalid: intent issued in the future")) + OnSuccess(Content); + }, [this, Url, ContentGenerator, OnSuccess, OnFailure](const FSequenceError& Error) + { + const FString Content = Error.Response->GetContentAsString(); + const int32 Code = Error.Response->GetResponseCode(); + SEQ_LOG_EDITOR(Error, TEXT("%d %s"), Code, *Content); + + if (!Content.Contains("intent is invalid: intent expired") && + !Content.Contains("intent is invalid: intent issued in the future")) { - FString Date = Response->GetHeader("Date"); - FDateTime Time; - bool IsParsed = FDateTime::ParseHttpDate(Date, Time); - - if(!IsParsed) - { - OnFailure(FSequenceError(FailedToParseIntentTime, "Failed to parse intent time " + Date)); - return; - } - - UE_LOG(LogTemp, Display, TEXT("Resending intent with date %i"), Time.ToUnixTimestamp()); - this->SequenceRPC(Url, ContentGenerator(TOptional(Time.ToUnixTimestamp())), OnSuccess, OnFailure); + OnFailure(Error); + return; } - else + + FDateTime Time; + const FString Date = Error.Response->GetHeader("Date"); + if(!FDateTime::ParseHttpDate(Date, Time)) { - OnSuccess(Content); + OnFailure(FSequenceError(FailedToParseIntentTime, Error.Response, "Failed to parse intent time " + Date)); + return; } - }, OnFailure); + + UE_LOG(LogTemp, Display, TEXT("Resending intent with date %i"), Time.ToUnixTimestamp()); + this->SequenceRPC(Url, ContentGenerator(TOptional(Time.ToUnixTimestamp())), OnSuccess, OnFailure); + }); } FString USequenceRPCManager::BuildGetFeeOptionsIntent(const FCredentials_BE& Credentials, const TArray& Transactions, TOptional CurrentTime) const @@ -952,6 +962,33 @@ void USequenceRPCManager::ForceOpenSessionInUse(const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + const TSuccessCallback OnResponse = [this, OnSuccess](const FString& OnResponse) + { + const FSeqLinkedWalletsResponse LinkedWallets = USequenceSupport::JSONStringToStruct(OnResponse); + OnSuccess(LinkedWallets); + }; + + this->SendIntent(this->BuildAPIUrl("GetLinkedWallets"),[this, Request](const TOptional& CurrentTime) + { + return USequenceSupport::StructToString(Request); + }, OnResponse, OnFailure); +} + +void USequenceRPCManager::RemoveLinkedWallet(const FSeqLinkedWalletRequest& Request, const TFunction& OnSuccess, const FFailureCallback& OnFailure) const +{ + const TSuccessCallback OnResponse = [this, OnSuccess](const FString& OnResponse) + { + OnSuccess(); + }; + + this->SendIntent(this->BuildAPIUrl("RemoveLinkedWallet"),[this, Request](const TOptional& CurrentTime) + { + return USequenceSupport::StructToString(Request); + }, OnResponse, OnFailure); +} + void USequenceRPCManager::FederateEmailSession(const FString& WalletIn, const FString& CodeIn, const TFunction& OnSuccess, const FFailureCallback& OnFailure) { this->UpdateWithStoredSessionWallet(); @@ -1145,4 +1182,4 @@ FTimespan USequenceRPCManager::GetTimeShiftFromResponse(const FString& DateHeade UE_LOG(LogTemp, Warning, TEXT("Failed to parse server time from date header: %s"), *DateHeader); return FTimespan::Zero(); -} +} \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.h index a00c09059..f69bf1bde 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.h @@ -49,7 +49,7 @@ class SEQUENCEPLUGIN_API USequenceRPCManager : public UObject */ bool PreserveSessionWallet = false; - inline const static FString WaaSVersion = FString(TEXT("1.0.0 (Unreal 1.5.1)")); + inline const static FString WaaSVersion = FString(TEXT("1.0.0 (Unreal 1.6.0)")); inline const static FString WaaSAuthenticatorIntentsUrlPath = TEXT("/rpc/WaasAuthenticator/SendIntent"); inline const static FString WaaSAuthenticatorRegisterUrlPath = TEXT("/rpc/WaasAuthenticator/RegisterSession"); @@ -276,6 +276,20 @@ class SEQUENCEPLUGIN_API USequenceRPCManager : public UObject * @param OnFailure Fires if there's an Authentication Issue */ void ForceOpenSessionInUse(const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); + + /** + * GetLinkedWallets + * @param OnSuccess + * @param OnFailure + */ + void GetLinkedWallets(const FSeqLinkedWalletRequest& Request, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; + + /** + * GetLinkedWallets + * @param OnSuccess + * @param OnFailure + */ + void RemoveLinkedWallet(const FSeqLinkedWalletRequest& Request, const TFunction& OnSuccess, const FFailureCallback& OnFailure) const; //Auth Calls// @@ -292,4 +306,4 @@ class SEQUENCEPLUGIN_API USequenceRPCManager : public UObject //Federation Calls// //RPC Calls// -}; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Errors.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Errors.h index 1d3cb83dd..e487439e3 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Errors.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Errors.h @@ -1,5 +1,6 @@ // Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. #pragma once +#include "Http.h" #include "Templates/ValueOrError.h" #include "Containers/UnrealString.h" @@ -20,9 +21,11 @@ enum EErrorType class SEQUENCEPLUGIN_API FSequenceError { public: - FSequenceError(EErrorType Type, FString Message); + FSequenceError(EErrorType Type, const FString& Message); + FSequenceError(EErrorType Type, const FHttpResponsePtr& Response, const FString& Message); + FHttpResponsePtr Response; FString Message; EErrorType Type; }; -template using TResult = TValueOrError; +template using TResult = TValueOrError; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace.h index a2fc51e63..51e199fbe 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Marketplace.h @@ -119,6 +119,16 @@ class SEQUENCEPLUGIN_API UMarketplace : public UObject */ void ListAllCollectibleOffersWithHighestPricedOfferFirst(const int64 ChainID, const FString& ContractAddress, const FSeqCollectiblesFilter& Filter, TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + /** + * Gets the meta data for a collectible + * @param ChainID the id of the chain + * @param ContractAddress the address of the contract + * @param TokenId the id of the token + * @param OnSuccess handler for success, takes in a FSeqTokenMetaData + * @param OnFailure handler for failure, takes in a FSequenceError + */ + void GetCollectible(const int64 ChainID, const FString& ContractAddress, const FString& TokenId, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + /** * Gets the lowest price offer for a collectible * @param ChainID the id of the chain diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h index 746225b32..126595f6d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentMethod.h @@ -6,9 +6,9 @@ UENUM(BlueprintType) enum ESardinePaymentMethod { - Us_Debit UMETA(DisplayName = "US_DEBIT"), - Us_Credit UMETA(DisplayName = "US_CREDIT"), - International_Debit UMETA(DisplayName = "INTERNATIONAL_DEBIT"), - International_Credit UMETA(DisplayName = "INTERNATIONAL_CREDIT"), - Ach UMETA(DisplayName = "ACH"), + PaymentMethod_Us_Debit UMETA(DisplayName = "US_DEBIT"), + PaymentMethod_Us_Credit UMETA(DisplayName = "US_CREDIT"), + PaymentMethod_International_Debit UMETA(DisplayName = "INTERNATIONAL_DEBIT"), + PaymentMethod_International_Credit UMETA(DisplayName = "INTERNATIONAL_CREDIT"), + PaymentMethod_Ach UMETA(DisplayName = "ACH"), }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleArgs.h new file mode 100644 index 000000000..a6e8a5bf8 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleArgs.h @@ -0,0 +1,33 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SeqCollectiblesFilter.h" +#include "SeqMarketplacePage.h" +#include "Util/JsonBuilder.h" +#include "SeqGetCollectibleArgs.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSeqGetCollectibleArgs +{ + GENERATED_USTRUCT_BODY() + +public: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Collectibles") + FString ContractAddress; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Collectibles") + FString TokenId; + + bool customGetter = true; + + FString GetArgs() + { + FJsonBuilder Builder; + + Builder.AddString("contractAddress", ContractAddress); + Builder.AddString("tokenId", TokenId); + + return Builder.ToString(); + } + +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleReturn.h new file mode 100644 index 000000000..25c290a19 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqGetCollectibleReturn.h @@ -0,0 +1,28 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SeqCollectibleOrder.h" +#include "SeqCurrency.h" +#include "SeqGetCollectibleReturn.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSeqGetCollectibleReturn +{ + GENERATED_USTRUCT_BODY() + +public: + bool customConstructor = false;//used to tell buildresponse whether or not to use a custom constructor OR the unreal one! + void construct(FJsonObject json_in) {};//dummy construct for templating + void Setup(FJsonObject json_in) + { + const TSharedPtr* obj; + if(json_in.TryGetObjectField(TEXT("metadata"), obj)) + { + MetaData.Setup(*obj->Get()); + } + }; + + // Properties + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Order") + FSeqTokenMetaData MetaData; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h index a0901ddc2..b231a7a4d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h @@ -310,6 +310,16 @@ class SEQUENCEPLUGIN_API USequenceWallet : public UGameInstanceSubsystem */ void GetTransactionHistory(const FSeqGetTransactionHistoryArgs& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; + /* + Get Linked Wallets + */ + void GetLinkedWallets(const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; + + /* + Remove a Linked Wallet + */ + void RemoveLinkedWallet(const FString& LinkedWalletAddress, const TFunction& OnSuccess, const FFailureCallback& OnFailure) const; + //Provider calls void BlockByNumber(uint64 Number, const TFunction)>& OnSuccess, diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceResponseIntent.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceResponseIntent.h index bd5ef2d2c..1acb80ac0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceResponseIntent.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceResponseIntent.h @@ -538,6 +538,59 @@ struct SEQUENCEPLUGIN_API FSeqIdTokenResponse } }; +// Wallet Linking + +USTRUCT(Blueprintable) +struct SEQUENCEPLUGIN_API FSeqLinkedWalletRequest +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "signatureChainId")) + FString SignatureChainId = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "parentWalletAddress")) + FString ParentWalletAddress = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "parentWalletMessage")) + FString ParentWalletMessage = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "parentWalletSignature")) + FString ParentWalletSignature = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "linkedWalletAddress")) + FString LinkedWalletAddress = ""; +}; + +USTRUCT(Blueprintable) +struct SEQUENCEPLUGIN_API FSeqLinkedWallet +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "id")) + int64 Id = 0; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "walletType")) + FString WalletType = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "walletAddress")) + FString WalletAddress = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "linkedWalletAddress")) + FString LinkedWalletAddress = ""; + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "createdAt")) + FString CreatedAt = ""; +}; + +USTRUCT(Blueprintable) +struct SEQUENCEPLUGIN_API FSeqLinkedWalletsResponse +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, meta = (JsonFieldName = "linkedWallets")) + TArray LinkedWallets; +}; + //Validate Signature// From 3c43895807cdd381bbd14ef4c5c481416cb9383e Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 17 Mar 2025 16:25:19 -0400 Subject: [PATCH 29/48] get enabled tokens response --- .../Marketplace/Sardine/SardineCheckout.cpp | 23 ++++++++++-- .../Marketplace/Sardine/SardineCheckout.h | 4 ++- .../Structs/SardineEnabledTokensResponse.h | 36 +++++++++++++++++++ .../Sardine/Structs/SardineToken.h | 11 ++++++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 7e137feb5..149900f27 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -7,6 +7,7 @@ #include "HttpModule.h" #include "Interfaces/IHttpResponse.h" #include "Marketplace/Marketplace.h" +#include "Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteArgs.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteResponse.h" #include "Util/Log.h" @@ -147,7 +148,7 @@ void USardineCheckout::SardineGetNFTCheckoutToken(TArray O //TODO Generate steps from checkout } -void USardineCheckout::SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, FString CollectionAddress, +void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress, TArray data, TArray Proof) { @@ -159,7 +160,25 @@ void USardineCheckout::SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContr UMarketplace* Marketplace = NewObject(); - Marketplace->GetCollectibleOrder(); + Marketplace->GetCollectible(ChainId, CollectionAddress, FString::FromInt(TokenID), [this, &SaleContract, Amount, OnSuccess, RecipientAddress, data, Proof](FSeqTokenMetaData MetaData) + { + //TODO + }, [OnFailure](FSequenceError Error) + { + SEQ_LOG_EDITOR(Error, TEXT("Failed to get collectible: %s"), *Error.Message); + OnFailure(Error); + }); //FSeqTokenMetaData metaData = } + +void USardineCheckout::SardineGetEnabledTokens(TSuccessCallback> OnSuccess, + const FFailureCallback& OnFailure) +{ + const FString Endpoint = "SardineGetEnabledTokens"; + HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) + { + const FSardineEnabledTokensResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Tokens); + }, OnFailure); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index 5c32f3a28..2a603d97d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -84,7 +84,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetNFTCheckoutToken(TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutToken(UERC1155SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); + void SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback + OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = + TArray(), TArray Proof = TArray()); void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h new file mode 100644 index 000000000..a63388223 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h @@ -0,0 +1,36 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardineEnabledToken.h" +#include "SardinePaymentType.h" +#include "SardineQuote.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "UObject/Object.h" +#include "SardineEnabledTokensResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineEnabledTokensResponse +{ + GENERATED_USTRUCT_BODY() + +public: + TArray Tokens; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + for(TSharedPtr json : json_in.GetArrayField(TEXT("tokens"))) + { + FSardineEnabledToken Token; + Token.Setup(*json->AsObject()); + Tokens.Add(Token); + } + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h index 412f7c3bb..73b51a5be 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineToken.h @@ -16,4 +16,15 @@ struct SEQUENCEPLUGIN_API FSardineToken FString TokenName; FString Token; FString TokenAddress; + + void Setup(FJsonObject& json_in) + { + json_in.TryGetStringField(TEXT("network"), Network); + json_in.TryGetStringField(TEXT("assetSymbol"), AssetSymbol); + json_in.TryGetStringField(TEXT("assetName"), AssetName); + json_in.TryGetStringField(TEXT("chainID"), ChainID); + json_in.TryGetStringField(TEXT("tokenName"), TokenName); + json_in.TryGetStringField(TEXT("token"), Token); + json_in.TryGetStringField(TEXT("tokenAddress"), TokenAddress); + } }; \ No newline at end of file From a8f8f3bf05bdd75b129f2a1244f014df3914aaff Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 17 Mar 2025 17:57:23 -0400 Subject: [PATCH 30/48] more sardine api filled out --- .../Marketplace/Sardine/SardineCheckout.cpp | 38 ++++++++++++++++++- .../Sardine/Structs/SardineFiatCurrency.h | 16 ++++++++ .../Sardine/Structs/SardinePaymentOption.h | 14 +++++++ .../Sardine/Structs/SardineRegion.h | 27 +++++++++++++ .../Structs/SardineRegionPaymentMethod.h | 10 +++++ .../Sardine/Structs/SardineRegionState.h | 8 ++++ .../SardineSupportedFiatCurrenciesResponse.h | 38 +++++++++++++++++++ .../Structs/SardineSupportedRegionsResponse.h | 38 +++++++++++++++++++ .../Structs/SardineSupportedTokensResponse.h | 37 ++++++++++++++++++ 9 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 149900f27..619913e3e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -10,6 +10,9 @@ #include "Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteArgs.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteResponse.h" +#include "Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h" +#include "Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h" +#include "Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h" #include "Util/Log.h" FString USardineCheckout::Url(const FString& EndPoint) const @@ -172,8 +175,41 @@ void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleCon //FSeqTokenMetaData metaData = } -void USardineCheckout::SardineGetEnabledTokens(TSuccessCallback> OnSuccess, +void USardineCheckout::SardineGetSupportedRegions(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure) +{ + const FString Endpoint = "SardineGetSupportedRegions"; + HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) + { + const FSardineSupportedRegionsResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Regions); + }, OnFailure); +} + +void USardineCheckout::SardineGetSupportedFiatCurrencies(TSuccessCallback> OnSuccess, + const FFailureCallback& OnFailure) +{ + const FString Endpoint = "SardineGetSupportedFiatCurrencies"; + HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) + { + const FSardineSupportedFiatCurrenciesResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Tokens); + }, OnFailure); +} + +void USardineCheckout::SardineGetSupportedTokens(TSuccessCallback> OnSuccess, + const FFailureCallback& OnFailure) +{ + const FString Endpoint = "SardineGetSupportedTokens"; + HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) + { + const FSardineSupportedTokensResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Tokens); + }, OnFailure); +} + +void USardineCheckout::SardineGetEnabledTokens(TSuccessCallback> OnSuccess, + const FFailureCallback& OnFailure) { const FString Endpoint = "SardineGetEnabledTokens"; HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h index 939f105ed..e2d58e669 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineFiatCurrency.h @@ -15,4 +15,20 @@ struct SEQUENCEPLUGIN_API FSardineFiatCurrency FString CurrencySymbol; TArray PaymentOptions; TArray SupportedCountries; + + void Setup(FJsonObject& json_in) + { + json_in.TryGetStringField(TEXT("currencyCode"), CurrencyCode); + json_in.TryGetStringField(TEXT("name"), Name); + json_in.TryGetStringField(TEXT("currencySymbol"), CurrencySymbol); + + for(TSharedPtr Option : json_in.GetArrayField(TEXT("paymentOptions"))) + { + FSardinePaymentOption PaymentOption; + PaymentOption.Setup(*Option->AsObject()); + PaymentOptions.Add(PaymentOption); + } + + json_in.TryGetStringArrayField(TEXT("supportedCountries"), SupportedCountries); + } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h index 4428cb1b4..b0473bf47 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardinePaymentOption.h @@ -19,4 +19,18 @@ struct SEQUENCEPLUGIN_API FSardinePaymentOption FString Type; FString SubType; FString ProcessingTime; + + void Setup(FJsonObject& json_in) + { + json_in.TryGetStringField(TEXT("name"), Name); + json_in.TryGetNumberField(TEXT("dailyLimit"), DailyLimit); + json_in.TryGetNumberField(TEXT("weeklyLimit"), WeeklyLimit); + json_in.TryGetNumberField(TEXT("monthlyLimit"), MonthlyLimit); + json_in.TryGetNumberField(TEXT("maxAmount"), MaxAmount); + json_in.TryGetNumberField(TEXT("minAmount"), MinAmount); + json_in.TryGetStringArrayField(TEXT("subTypes"), SubTypes); + json_in.TryGetStringField(TEXT("type"), Type); + json_in.TryGetStringField(TEXT("subType"), SubType); + json_in.TryGetStringField(TEXT("processingTime"), ProcessingTime); + } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h index 4e8b71bce..57cd416f5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegion.h @@ -22,4 +22,31 @@ struct SEQUENCEPLUGIN_API FSardineRegion TArray SupportedDocuments; TArray PaymentMethods; TArray States; + + void Setup(FJsonObject& json_in) + { + json_in.TryGetStringField(TEXT("countryCode"), CountryCode); + json_in.TryGetBoolField(TEXT("isAllowedOnRamp"), IsAllowedOnRamp); + json_in.TryGetBoolField(TEXT("isAllowedOnNFT"), IsAllowedOnNFT); + json_in.TryGetStringArrayField(TEXT("isBasicKycRequired"), IsBasicKycRequired); + json_in.TryGetStringArrayField(TEXT("isSSNRequired"), IsSSNRequired); + json_in.TryGetStringField(TEXT("name"), Name); + json_in.TryGetStringField(TEXT("currencyCode"), CurrencyCode); + json_in.TryGetBoolField(TEXT("isPayrollSupported"), IsPayrollSupported); + json_in.TryGetStringArrayField(TEXT("supportedDocuments"), SupportedDocuments); + + for(TSharedPtr Method : json_in.GetArrayField(TEXT("paymentMethods"))) + { + FSardineRegionPaymentMethod PaymentMethod; + PaymentMethod.Setup(*Method->AsObject()); + PaymentMethods.Add(PaymentMethod); + } + + for(TSharedPtr State : json_in.GetArrayField(TEXT("states"))) + { + FSardineRegionState RegionState; + RegionState.Setup(*State->AsObject()); + States.Add(RegionState); + } + } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h index dc3743ff4..ccc2d60d6 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionPaymentMethod.h @@ -15,4 +15,14 @@ struct SEQUENCEPLUGIN_API FSardineRegionPaymentMethod TArray SubTypes; FString Type; FString SubType; + + void Setup(FJsonObject& json_in) + { + json_in.TryGetStringField(TEXT("name"), Name); + json_in.TryGetBoolField(TEXT("isAllowedOnRamp"), IsAllowedOnRamp); + json_in.TryGetBoolField(TEXT("isAllowedOnNFT"), IsAllowedOnNFT); + json_in.TryGetStringArrayField(TEXT("subTypes"), SubTypes); + json_in.TryGetStringField(TEXT("type"), Type); + json_in.TryGetStringField(TEXT("subType"), SubType); + } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h index d0e671047..a89db5205 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineRegionState.h @@ -14,4 +14,12 @@ struct SEQUENCEPLUGIN_API FSardineRegionState FString Name; bool IsAllowedOnRamp; bool IsAllowedOnNFT; + + void Setup(FJsonObject& json_in) + { + json_in.TryGetStringField(TEXT("code"), Code); + json_in.TryGetStringField(TEXT("name"), Name); + json_in.TryGetBoolField(TEXT("isAllowedOnRamp"), IsAllowedOnRamp); + json_in.TryGetBoolField(TEXT("isAllowedOnNFT"), IsAllowedOnNFT); + } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h new file mode 100644 index 000000000..086f2e0c0 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h @@ -0,0 +1,38 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardineEnabledToken.h" +#include "SardineFiatCurrency.h" +#include "SardinePaymentType.h" +#include "SardineQuote.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "SardineSupportedToken.h" +#include "UObject/Object.h" +#include "SardineSupportedFiatCurrenciesResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineSupportedFiatCurrenciesResponse +{ + GENERATED_USTRUCT_BODY() + +public: + TArray Tokens; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + for(TSharedPtr json : json_in.GetArrayField(TEXT("tokens"))) + { + FSardineFiatCurrency Currency; + Currency.Setup(*json->AsObject()); + Tokens.Add(Currency); + } + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h new file mode 100644 index 000000000..013aeea3b --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h @@ -0,0 +1,38 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardineEnabledToken.h" +#include "SardinePaymentType.h" +#include "SardineQuote.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "SardineRegion.h" +#include "SardineSupportedToken.h" +#include "UObject/Object.h" +#include "SardineSupportedRegionsResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineSupportedRegionsResponse +{ + GENERATED_USTRUCT_BODY() + +public: + TArray Regions; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + for(TSharedPtr json : json_in.GetArrayField(TEXT("regions"))) + { + FSardineRegion Token; + Token.Setup(*json->AsObject()); + Regions.Add(Token); + } + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h new file mode 100644 index 000000000..29cd31c19 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h @@ -0,0 +1,37 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardineEnabledToken.h" +#include "SardinePaymentType.h" +#include "SardineQuote.h" +#include "Util/JsonBuilder.h" +#include "SardineQuoteType.h" +#include "SardineSupportedToken.h" +#include "UObject/Object.h" +#include "SardineSupportedTokensResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineSupportedTokensResponse +{ + GENERATED_USTRUCT_BODY() + +public: + TArray Tokens; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + for(TSharedPtr json : json_in.GetArrayField(TEXT("tokens"))) + { + FSardineSupportedToken Token; + Token.Setup(*json->AsObject()); + Tokens.Add(Token); + } + } +}; \ No newline at end of file From 9c51818e993701efb165f328ef8e0002ac5dc6d2 Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Thu, 27 Mar 2025 13:24:23 -0400 Subject: [PATCH 31/48] ik/fixing build errors after rebasing marketplace checkout branch --- .../SequencePlugin/Private/RequestHandler.cpp | 62 ------------------- .../Marketplace/Sardine/SardineCheckout.h | 2 +- .../Marketplace/Structs/AdditionalFee.h | 14 ----- 3 files changed, 1 insertion(+), 77 deletions(-) delete mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp index e258bb917..db40c0942 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/RequestHandler.cpp @@ -194,65 +194,3 @@ void URequestHandler::ProcessAndThen(const TSuccessCallback& OnSucc OnFailure(FSequenceError(RequestFail, "Failed to build QR Image data")); });//lambda } - -void URequestHandler::ProcessAndThen(UResponseSignatureValidator& Validator, TFunction& OnSuccess, FFailureCallback& OnFailure) const -{ - if (Validator.HasFoundTamperedResponse()) - { - UE_LOG(LogTemp, Error, TEXT("Validator is null!")); - OnFailure(FSequenceError(RequestFail, "Validator is null.")); - return; - } - - Process().BindLambda([&Validator,OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) - { - if (bWasSuccessful) - { - if (Validator.ValidateResponseSignature(Response)) - { - UE_LOG(LogTemp, Log, TEXT("Valid Signature")); - OnSuccess(Response->GetContentAsString()); - } - else - { - UE_LOG(LogTemp, Log, TEXT("Invalid Signature")); - OnFailure(FSequenceError(RequestFail, "Invalid response Signature")); - } - } - else - { - if (Response.IsValid()) - { - OnFailure(FSequenceError(RequestFail, "Request is invalid: " + Response->GetContentAsString())); - } - else - { - OnFailure(FSequenceError(RequestFail, "Request failed: No response received!")); - } - } - }); -} - -void URequestHandler::ProcessAndThen(TSuccessCallback& OnSuccess, - const FFailureCallback& OnFailure) const -{ - Process().BindLambda([OnSuccess, OnFailure](FHttpRequestPtr Req, const FHttpResponsePtr& Response, const bool bWasSuccessful) - { - if(bWasSuccessful) - { - OnSuccess(Response); - } - else - { - if(!Response.IsValid()) - OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); - else - { - if (Response.IsValid()) - OnFailure(FSequenceError(RequestFail, "The Request is invalid!")); - else - OnFailure(FSequenceError(RequestFail, "Request failed: " + Response->GetContentAsString())); - } - }); - } -} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index 2a603d97d..91060901e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -3,7 +3,7 @@ #pragma once #include "CoreMinimal.h" -#include "Marketplace/Structs/AdditionalFee.h" +#include "Checkout/Structs/AdditionalFee.h" #include "Marketplace/Structs/SeqCollectibleOrder.h" #include "Structs/SardineEnabledToken.h" #include "Structs/SardineFiatCurrency.h" diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h deleted file mode 100644 index 37f6bb678..000000000 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/AdditionalFee.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "AdditionalFee.generated.h" - -USTRUCT(BlueprintType) -struct SEQUENCEPLUGIN_API FAdditionalFee -{ - GENERATED_USTRUCT_BODY() - -public: - FString Amount; - FString Receiver; -}; \ No newline at end of file From afe7f2d431457a47fe262581dba0a1cd11deab6b Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 17 Oct 2024 13:05:31 -0400 Subject: [PATCH 32/48] Updated SignInOutRepeatedlyTest such that it verifies that the session ids each time are unique. In addition, exposed the session id in the SequenceAPI --- .../Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index d4cf5f6f1..87da402b6 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -201,6 +201,12 @@ void USequenceWallet::GetIdToken(const FString& Nonce, const TSuccessCallbackCredentials.GetSessionWallet()->GetSessionId(); +} + + void USequenceWallet::ListSessions(const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) const { if (this->SequenceRPCManager) From 7b13c60f09db39d395d9bcb00aa7ea72682c052a Mon Sep 17 00:00:00 2001 From: caballoninja Date: Tue, 22 Oct 2024 12:39:03 -0300 Subject: [PATCH 33/48] Futher Validator checks Implemented Signature tampering checks for all http requesthandler calls. --- .../Private/Sequence/SequenceAPI.cpp | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index 87da402b6..180e8a743 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -13,6 +13,61 @@ #include "Transak.h" #include "SequenceRPCManager.h" +FTransaction_Sequence FTransaction_Sequence::Convert(const FTransaction_FE& Transaction_Fe) +{ + return FTransaction_Sequence{ + static_cast(Transaction_Fe.chainId), + FAddress::From(Transaction_Fe.From), + FAddress::From(Transaction_Fe.To), + Transaction_Fe.AutoGas == "" ? TOptional() : TOptional(Transaction_Fe.AutoGas), + Transaction_Fe.Nonce < 0 ? TOptional() : TOptional(static_cast(Transaction_Fe.Nonce)), + Transaction_Fe.Value == "" ? TOptional() : TOptional(Transaction_Fe.Value), + Transaction_Fe.CallData == "" ? TOptional() : TOptional(Transaction_Fe.CallData), + Transaction_Fe.TokenAddress == "" ? TOptional() : TOptional(Transaction_Fe.TokenAddress), + Transaction_Fe.TokenAmount == "" ? TOptional() : TOptional(Transaction_Fe.TokenAmount), + Transaction_Fe.TokenIds.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenIds), + Transaction_Fe.TokenAmounts.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenAmounts), + }; +} + +FString FTransaction_Sequence::ToJson() +{ + FJsonBuilder Json = FJsonBuilder(); + + Json.AddInt("chainId", ChainId); + Json.AddString("from", "0x" + From.ToHex()); + Json.AddString("to", "0x" + To.ToHex()); + + if(this->Value.IsSet()) Json.AddString("value", this->Value.GetValue()); + + return Json.ToString(); +} + +TransactionID FTransaction_Sequence::ID() +{ + FUnsizedData Data = StringToUTF8(ToJson()); + return GetKeccakHash(Data).ToHex(); +} + +FString USequenceWallet::Url(const FString& Name) const +{ + return this->Hostname + this->Path + Name; +} + +void USequenceWallet::SendRPC(const FString& Url, const FString& Content, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + URequestHandler* RequestHandler = NewObject(); + + RequestHandler->PrepareRequest() + ->WithUrl(Url) + ->WithHeader("Content-type", "application/json") + ->WithHeader("Authorization", "Bearer " + this->Credentials.GetIDToken()) + ->WithVerb("POST") + ->WithContentAsString(Content); + + RequestHandler->ProcessAndThen(*SequenceRPCManager->Validator, OnSuccess, OnFailure); +} + USequenceWallet::USequenceWallet() { this->Indexer = NewObject(); From 94368fc7e16f238307b6a3459a5c57cda912b135 Mon Sep 17 00:00:00 2001 From: Jan Dohring <114616439+ZemindJan@users.noreply.github.com> Date: Mon, 17 Mar 2025 14:17:16 -0400 Subject: [PATCH 34/48] Added get collectible to marketplace --- .../Private/Sequence/SequenceAPI.cpp | 61 ------------------- 1 file changed, 61 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index 180e8a743..d4cf5f6f1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -13,61 +13,6 @@ #include "Transak.h" #include "SequenceRPCManager.h" -FTransaction_Sequence FTransaction_Sequence::Convert(const FTransaction_FE& Transaction_Fe) -{ - return FTransaction_Sequence{ - static_cast(Transaction_Fe.chainId), - FAddress::From(Transaction_Fe.From), - FAddress::From(Transaction_Fe.To), - Transaction_Fe.AutoGas == "" ? TOptional() : TOptional(Transaction_Fe.AutoGas), - Transaction_Fe.Nonce < 0 ? TOptional() : TOptional(static_cast(Transaction_Fe.Nonce)), - Transaction_Fe.Value == "" ? TOptional() : TOptional(Transaction_Fe.Value), - Transaction_Fe.CallData == "" ? TOptional() : TOptional(Transaction_Fe.CallData), - Transaction_Fe.TokenAddress == "" ? TOptional() : TOptional(Transaction_Fe.TokenAddress), - Transaction_Fe.TokenAmount == "" ? TOptional() : TOptional(Transaction_Fe.TokenAmount), - Transaction_Fe.TokenIds.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenIds), - Transaction_Fe.TokenAmounts.Num() == 0 ? TOptional>() : TOptional(Transaction_Fe.TokenAmounts), - }; -} - -FString FTransaction_Sequence::ToJson() -{ - FJsonBuilder Json = FJsonBuilder(); - - Json.AddInt("chainId", ChainId); - Json.AddString("from", "0x" + From.ToHex()); - Json.AddString("to", "0x" + To.ToHex()); - - if(this->Value.IsSet()) Json.AddString("value", this->Value.GetValue()); - - return Json.ToString(); -} - -TransactionID FTransaction_Sequence::ID() -{ - FUnsizedData Data = StringToUTF8(ToJson()); - return GetKeccakHash(Data).ToHex(); -} - -FString USequenceWallet::Url(const FString& Name) const -{ - return this->Hostname + this->Path + Name; -} - -void USequenceWallet::SendRPC(const FString& Url, const FString& Content, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const -{ - URequestHandler* RequestHandler = NewObject(); - - RequestHandler->PrepareRequest() - ->WithUrl(Url) - ->WithHeader("Content-type", "application/json") - ->WithHeader("Authorization", "Bearer " + this->Credentials.GetIDToken()) - ->WithVerb("POST") - ->WithContentAsString(Content); - - RequestHandler->ProcessAndThen(*SequenceRPCManager->Validator, OnSuccess, OnFailure); -} - USequenceWallet::USequenceWallet() { this->Indexer = NewObject(); @@ -256,12 +201,6 @@ void USequenceWallet::GetIdToken(const FString& Nonce, const TSuccessCallbackCredentials.GetSessionWallet()->GetSessionId(); -} - - void USequenceWallet::ListSessions(const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) const { if (this->SequenceRPCManager) From 5917ababcd1956d2cc1a53fd18049bce2a451843 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 10 Oct 2024 15:01:41 -0300 Subject: [PATCH 35/48] First Commit for validation Set up and start validation. Calculate digest and compare (failing currently ) --- .../Source/SequencePlugin/Private/SequenceRPCManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp index 40688639f..511fdffe1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/SequenceRPCManager.cpp @@ -66,6 +66,7 @@ void USequenceRPCManager::SequenceRPC(const FString& Url, const FString& Content ->WithHeader("Content-type", "application/json") ->WithHeader("Accept", "application/json") ->WithHeader("X-Access-Key", this->Cached_ProjectAccessKey) + ->WithHeader("Accept-Signature", "sig=()") ->WithVerb("POST") ->WithContentAsString(Content) ->ProcessAndThen(OnSuccess, OnFailure); From 4f6ec3aceb1536debf82911677963229aa4fd799 Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Wed, 19 Mar 2025 14:30:46 -0400 Subject: [PATCH 36/48] Implementing endpoints for ticket #287 --- .../Structs/SardineGetClientTokenReturn.h | 24 ++++++++++ .../Sardine/Structs/SardineGetQuoteReturn.h | 25 +++++++++++ .../SardineGetSupportedFiatCurrenciesReturn.h | 44 ++++++++++++++++++ .../SardineGetSupportedRegionsReturn.h | 45 +++++++++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h new file mode 100644 index 000000000..d30e5d177 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h @@ -0,0 +1,24 @@ +#pragma once + +#include "SardineGetClientTokenReturn.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FsardineGetClientTokenReturn +{ + GENERATED_USTRUCT_BODY() + + FString Token; + + bool customConstructor = false; // Flag to determine the constructor used + + // Dummy constructor method to maintain consistency + void construct(FJsonObject json_in) {} + + /* + * Handles edge cases with Unreal's JSON parsing + */ + void Setup(FJsonObject json_in) + { + Token = json_in.GetStringField(TEXT("token")); + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h new file mode 100644 index 000000000..2ba86c7e1 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h @@ -0,0 +1,25 @@ +#pragma once + +#include "SardineQuote.h" +#include "SardineGetQuoteReturn.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetQuoteReturn +{ + GENERATED_USTRUCT_BODY() + + FSardineQuote Quote; + + bool customConstructor = false; // Flag to determine the constructor used + + // Dummy constructor method to maintain consistency + void construct(FJsonObject json_in) {} + + /* + * Handles edge cases with Unreal's JSON parsing + */ + void Setup(FJsonObject json_in) + { + Quote.Setup(*json_in.GetObjectField(TEXT("quote"))); + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h new file mode 100644 index 000000000..8d1a0c595 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h @@ -0,0 +1,44 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineFiatCurrency.h" +#include "SardineGetSupportedFiatCurrenciesReturn.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetSupportedFiatCurrenciesReturn +{ + GENERATED_USTRUCT_BODY() + + TArray Currencies; + + bool customConstructor = false; // Flag to determine the constructor used + + // Dummy constructor method to maintain consistency + void construct(FJsonObject json_in) {} + + /* + * Handles edge cases with Unreal's JSON parsing + */ + void Setup(FJsonObject json_in) + { + const TArray>* CurrenciesJson; + if (json_in.TryGetArrayField(TEXT("tokens"), CurrenciesJson)) + { + Currencies.SetNum(CurrenciesJson->Num()); + + for (int32 i = 0; i < CurrenciesJson->Num(); i++) + { + TSharedPtr Currency = (*CurrenciesJson)[i]; + if (Currency.IsValid()) + { + TSharedPtr CurrencyObj = Currency->AsObject(); + Currencies[i].Setup(*CurrencyObj); + } + } + } + else + { + UE_LOG(LogTemp, Warning, TEXT("No tokens field found in the SardineGetSupportedFiatCurrencies response.")); + } + } +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h new file mode 100644 index 000000000..2dc12e317 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h @@ -0,0 +1,45 @@ +#pragma once + +#include "CoreMinimal.h" +#include "SardineRegion.h" +#include "SardineGetSupportedRegionsReturn.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetSupportedRegionsReturn +{ + GENERATED_USTRUCT_BODY() + + TArray Regions; + + bool customConstructor = false; // Flag to determine the constructor used + + // Dummy constructor method to maintain consistency + void construct(FJsonObject json_in) {} + + /* + * Handles edge cases with Unreal's JSON parsing + */ + void Setup(FJsonObject json_in) + { + const TArray>* lst; + if (json_in.TryGetArrayField(TEXT("regions"), lst)) + { + Regions.SetNum(lst->Num()); + + for (int32 i = 0; i < lst->Num(); i++) + { + TSharedPtr item = (*lst)[i]; + + if (item.IsValid()) + { + TSharedPtr itemObj = item->AsObject(); + Regions[i].Setup(*itemObj); + } + } + } + else + { + UE_LOG(LogTemp, Warning, TEXT("No regions field found in the SardineGetSupportedRegions response.")); + } + } +}; From 97cfc3c87bffd752f117d98ebcc5482bfffb4bed Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Fri, 21 Mar 2025 16:24:35 -0400 Subject: [PATCH 37/48] ik/Adding test cases for no arg calls; modifying data types to account for null types in optional array fields --- .../Structs/SardineGetClientTokenReturn.h | 2 +- .../SardineGetClientTokenTest.cpp | 65 +++++++++++++++++ .../SardineTests/SardineGetClientTokenTest.h | 24 +++++++ .../SardineGetSupportedFiatCurrenciesTest.cpp | 69 +++++++++++++++++++ .../SardineGetSupportedFiatCurrenciesTest.h | 24 +++++++ .../SardineGetSupportedRegionsTest.cpp | 69 +++++++++++++++++++ .../SardineGetSupportedRegionsTest.h | 24 +++++++ 7 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.cpp create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.h create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.cpp create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.h create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.cpp create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h index d30e5d177..666ec5925 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h @@ -3,7 +3,7 @@ #include "SardineGetClientTokenReturn.generated.h" USTRUCT(BlueprintType) -struct SEQUENCEPLUGIN_API FsardineGetClientTokenReturn +struct SEQUENCEPLUGIN_API FSardineGetClientTokenReturn { GENERATED_USTRUCT_BODY() diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.cpp new file mode 100644 index 000000000..826847100 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.cpp @@ -0,0 +1,65 @@ +#include "SardineGetClientTokenTest.h" +#include "CoreMinimal.h" +#include "Misc/AutomationTest.h" +#include "Engine/World.h" +#include "Marketplace/Sardine/SardineCheckout.h" +#include "Tests/AutomationCommon.h" +#include "Tests/AutomationEditorCommon.h" +#include "Util/Async.h" + +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineGetClientTokenTest, "SequencePlugin.EndToEnd.SardineTests.GetClientTokenTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +void FSardineGetClientTokenTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +{ + OutBeautifiedNames.Add(TEXT("Sardine Get Client Token Test")); + OutTestCommands.Add(TEXT("")); +} + +bool FSardineGetClientTokenTest::RunTest(const FString& Parameters) +{ + AddInfo(TEXT("Starting Sardine Get Client Token Test")); + + // Start PIE + ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); + + // Wait for PIE to initialize + ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(1.0f)); + + // Run the actual test + ADD_LATENT_AUTOMATION_COMMAND(FFunctionLatentCommand([this]() + { + USardineGetClientTokenTestHelper* TestHelper = NewObject(); + TestHelper->ParentTest = this; + TestHelper->RunTest(); + + ADD_LATENT_AUTOMATION_COMMAND(FWaitForGetClientTokenToComplete(TestHelper)); + return true; + })); + return true; +} + +void USardineGetClientTokenTestHelper::RunTest() +{ + Checkout = NewObject(); + + const TSuccessCallback GetClientTokenSuccess = [this](const FString& Token) + { + bTestComplete = true; + const FString Message = "SardineGetClientToken request succeeded with token"; + ParentTest->AddInfo(FString::Printf(TEXT("%s: %s"), *Message, *Token)); + }; + + const FFailureCallback GetClientTokenFailure = [this](const FSequenceError& Error) + { + bTestComplete = true; + const FString Message = "Request Failure"; + ParentTest->AddError(FString::Printf(TEXT("%s: %s."), *Message, *Error.Message)); + }; + + Checkout->SardineGetClientToken(GetClientTokenSuccess, GetClientTokenFailure); +} + +bool FWaitForGetClientTokenToComplete::Update() +{ + return TestHelper->IsTestComplete(); +} diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.h new file mode 100644 index 000000000..9c19f1859 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetClientTokenTest.h @@ -0,0 +1,24 @@ +#pragma once +#include "Marketplace/Sardine/SardineCheckout.h" + +#include "SardineGetClientTokenTest.generated.h" + +class FSardineGetClientTokenTest; + +UCLASS() +class USardineGetClientTokenTestHelper : public UObject +{ + GENERATED_BODY() + +public: + void RunTest(); + bool IsTestComplete() const { return bTestComplete; } + + FSardineGetClientTokenTest* ParentTest; + +private: + bool bTestComplete = false; + USardineCheckout* Checkout = nullptr; +}; + +DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForGetClientTokenToComplete, USardineGetClientTokenTestHelper*, TestHelper); diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.cpp new file mode 100644 index 000000000..5c1efabf1 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.cpp @@ -0,0 +1,69 @@ +#include "SardineGetSupportedFiatCurrenciesTest.h" +#include "CoreMinimal.h" +#include "Misc/AutomationTest.h" +#include "Engine/World.h" +#include "Marketplace/Sardine/SardineCheckout.h" +#include "Tests/AutomationCommon.h" +#include "Tests/AutomationEditorCommon.h" +#include "Util/Async.h" + +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineGetSupportedFiatCurrenciesTest, "SequencePlugin.EndToEnd.SardineTests.GetSupportedFiatCurrenciesTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +void FSardineGetSupportedFiatCurrenciesTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +{ + OutBeautifiedNames.Add(TEXT("Sardine Get Supported Fiat Currencies Test")); + OutTestCommands.Add(TEXT("")); +} + +bool FSardineGetSupportedFiatCurrenciesTest::RunTest(const FString& Parameters) +{ + AddInfo(TEXT("Starting Sardine Get Supported Fiat Currencies Test")); + + // Start PIE + ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); + + // Wait for PIE to initialize + ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(1.0f)); + + // Run the actual test + ADD_LATENT_AUTOMATION_COMMAND(FFunctionLatentCommand([this]() + { + USardineGetSupportedFiatCurrenciesTestHelper* TestHelper = NewObject(); + TestHelper->ParentTest = this; + TestHelper->RunTest(); + + ADD_LATENT_AUTOMATION_COMMAND(FWaitForGetSupportedFiatCurrenciesToComplete(TestHelper)); + return true; + })); + return true; +} + +void USardineGetSupportedFiatCurrenciesTestHelper::RunTest() +{ + Checkout = NewObject(); + + const TSuccessCallback> GetSupportedFiatCurrenciesSuccess = [this](const TArray& Currencies) + { + bTestComplete = true; + const FString Message = "SardineGetSupportedFiatCurrencies request succeeded with currencies:"; + ParentTest->AddInfo(Message); + for (const FSardineFiatCurrency& Currency : Currencies) + { + ParentTest->AddInfo(FString::Printf(TEXT("%s: %s."), *Currency.CurrencyCode, *Currency.Name)); + } + }; + + const FFailureCallback GenericFailure = [this](const FSequenceError& Error) + { + bTestComplete = true; + const FString Message = "Request Failure"; + ParentTest->AddError(FString::Printf(TEXT("%s: %s."), *Message, *Error.Message)); + }; + + Checkout->SardineGetSupportedFiatCurrencies(GetSupportedFiatCurrenciesSuccess, GenericFailure); +} + +bool FWaitForGetSupportedFiatCurrenciesToComplete::Update() +{ + return TestHelper->IsTestComplete(); +} diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.h new file mode 100644 index 000000000..64ed8937d --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedFiatCurrenciesTest.h @@ -0,0 +1,24 @@ +#pragma once +#include "Marketplace/Sardine/SardineCheckout.h" + +#include "SardineGetSupportedFiatCurrenciesTest.generated.h" + +class FSardineGetSupportedFiatCurrenciesTest; + +UCLASS() +class USardineGetSupportedFiatCurrenciesTestHelper : public UObject +{ + GENERATED_BODY() + +public: + void RunTest(); + bool IsTestComplete() const { return bTestComplete; } + + FSardineGetSupportedFiatCurrenciesTest* ParentTest; + +private: + bool bTestComplete = false; + USardineCheckout* Checkout = nullptr; +}; + +DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForGetSupportedFiatCurrenciesToComplete, USardineGetSupportedFiatCurrenciesTestHelper*, TestHelper); diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.cpp new file mode 100644 index 000000000..c85ffda00 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.cpp @@ -0,0 +1,69 @@ +#include "SardineGetSupportedRegionsTest.h" +#include "CoreMinimal.h" +#include "Misc/AutomationTest.h" +#include "Engine/World.h" +#include "Marketplace/Sardine/SardineCheckout.h" +#include "Tests/AutomationCommon.h" +#include "Tests/AutomationEditorCommon.h" +#include "Util/Async.h" + +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineGetSupportedRegionsTest, "SequencePlugin.EndToEnd.SardineTests.GetSupportedRegionsTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +void FSardineGetSupportedRegionsTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +{ + OutBeautifiedNames.Add(TEXT("Sardine Get Supported Regions Test")); + OutTestCommands.Add(TEXT("")); +} + +bool FSardineGetSupportedRegionsTest::RunTest(const FString& Parameters) +{ + AddInfo(TEXT("Starting Sardine Get Supported Regions Test")); + + // Start PIE + ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); + + // Wait for PIE to initialize + ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(1.0f)); + + // Run the actual test + ADD_LATENT_AUTOMATION_COMMAND(FFunctionLatentCommand([this]() + { + USardineGetSupportedRegionsTestHelper* TestHelper = NewObject(); + TestHelper->ParentTest = this; + TestHelper->RunTest(); + + ADD_LATENT_AUTOMATION_COMMAND(FWaitForGetSupportedRegionsToComplete(TestHelper)); + return true; + })); + return true; +} + +void USardineGetSupportedRegionsTestHelper::RunTest() +{ + Checkout = NewObject(); + + const TSuccessCallback> GetSupportedRegionsSuccess = [this](const TArray& Regions) + { + bTestComplete = true; + const FString Message = "SardineGetSupportedRegions request succeeded with regions:"; + ParentTest->AddInfo(Message); + for (const FSardineRegion& Region : Regions) + { + ParentTest->AddInfo(FString::Printf(TEXT("%s: %s."), *Region.CountryCode, *Region.Name)); + } + }; + + const FFailureCallback GenericFailure = [this](const FSequenceError& Error) + { + bTestComplete = true; + const FString Message = "Request Failure"; + ParentTest->AddError(FString::Printf(TEXT("%s: %s."), *Message, *Error.Message)); + }; + + Checkout->SardineGetSupportedRegions(GetSupportedRegionsSuccess, GenericFailure); +} + +bool FWaitForGetSupportedRegionsToComplete::Update() +{ + return TestHelper->IsTestComplete(); +} diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.h new file mode 100644 index 000000000..a782eaba4 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetSupportedRegionsTest.h @@ -0,0 +1,24 @@ +#pragma once +#include "Marketplace/Sardine/SardineCheckout.h" + +#include "SardineGetSupportedRegionsTest.generated.h" + +class FSardineGetSupportedRegionsTest; + +UCLASS() +class USardineGetSupportedRegionsTestHelper : public UObject +{ + GENERATED_BODY() + +public: + void RunTest(); + bool IsTestComplete() const { return bTestComplete; } + + FSardineGetSupportedRegionsTest* ParentTest; + +private: + bool bTestComplete = false; + USardineCheckout* Checkout = nullptr; +}; + +DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForGetSupportedRegionsToComplete, USardineGetSupportedRegionsTestHelper*, TestHelper); From f59a16235019892e52e5be0fc2488a550ee8eb0c Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Mon, 24 Mar 2025 16:47:17 -0400 Subject: [PATCH 38/48] ik/Adding on ramp url for client tokens --- .../Public/Marketplace/Sardine/SardineCheckout.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index 91060901e..7a4df32b3 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -78,9 +78,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetClientToken(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void OnRamp(FString ClientToken); + void OnRamp(FString ClientToken, bool IsDev = false); - void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); + void OnRampAsync(FString ClientToken, TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); void SardineGetNFTCheckoutToken(TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); @@ -99,6 +99,8 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetSupportedTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); void SardineGetEnabledTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + FString CheckoutURL(FString ClientToken, bool IsDev); FString CheckoutURL(FSardineNFTCheckout Token); From b00d818d988e5c612e2f55ae4d0babc77f9c7c8f Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Mon, 24 Mar 2025 18:41:41 -0400 Subject: [PATCH 39/48] ik/Post-merge conflicts fix and implementing missing endpoints --- .../Marketplace/Sardine/SardineCheckout.cpp | 31 ++++++++++++++++++- .../Marketplace/Sardine/SardineCheckout.h | 7 +++-- .../Sardine/Structs/SardineTokenResponse.h | 27 ++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineTokenResponse.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 619913e3e..cf88f00c1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -13,6 +13,7 @@ #include "Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h" #include "Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h" #include "Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h" +#include "Marketplace/Sardine/Structs/SardineTokenResponse.h" #include "Util/Log.h" FString USardineCheckout::Url(const FString& EndPoint) const @@ -129,7 +130,23 @@ void USardineCheckout::SardineGetQuote(TSuccessCallback OnSuccess void USardineCheckout::SardineGetClientToken(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) { - + const FString Endpoint = "SardineGetClientToken"; + HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) + { + const FSardineTokenResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Token); + }, OnFailure); +} + +void USardineCheckout::OnRamp(const FString& ClientToken) +{ + FString URL = CheckoutURL(ClientToken); + FString * ErrorPtr = nullptr; + FPlatformProcess::LaunchURL(*URL,TEXT(""),ErrorPtr); + if (ErrorPtr) + { + UE_LOG(LogTemp,Error,TEXT("Browser LaunchError: %s"), **ErrorPtr); + } } void USardineCheckout::SardineGetNFTCheckoutToken(TArray Orders, long Quantity, @@ -218,3 +235,15 @@ void USardineCheckout::SardineGetEnabledTokens(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void OnRamp(FString ClientToken, bool IsDev = false); + void OnRamp(const FString& ClientToken); - void OnRampAsync(FString ClientToken, TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); + void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); void SardineGetNFTCheckoutToken(TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); @@ -100,7 +101,7 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetEnabledTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); - FString CheckoutURL(FString ClientToken, bool IsDev); + FString CheckoutURL(FString ClientToken); FString CheckoutURL(FSardineNFTCheckout Token); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineTokenResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineTokenResponse.h new file mode 100644 index 000000000..12f85db84 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineTokenResponse.h @@ -0,0 +1,27 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "SardineSupportedToken.h" +#include "UObject/Object.h" +#include "SardineTokenResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineTokenResponse +{ + GENERATED_USTRUCT_BODY() + +public: + FString Token; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + Token = json_in.GetStringField(TEXT("token")); + } +}; From 3ba1d856e649babfa3495b334504691fc22cba5a Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Mon, 24 Mar 2025 18:49:49 -0400 Subject: [PATCH 40/48] ik/removing unnecessary files --- .../Structs/SardineGetClientTokenReturn.h | 24 ---------- .../Sardine/Structs/SardineGetQuoteReturn.h | 25 ----------- .../SardineGetSupportedFiatCurrenciesReturn.h | 44 ------------------ .../SardineGetSupportedRegionsReturn.h | 45 ------------------- 4 files changed, 138 deletions(-) delete mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h delete mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h delete mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h delete mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h deleted file mode 100644 index 666ec5925..000000000 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetClientTokenReturn.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "SardineGetClientTokenReturn.generated.h" - -USTRUCT(BlueprintType) -struct SEQUENCEPLUGIN_API FSardineGetClientTokenReturn -{ - GENERATED_USTRUCT_BODY() - - FString Token; - - bool customConstructor = false; // Flag to determine the constructor used - - // Dummy constructor method to maintain consistency - void construct(FJsonObject json_in) {} - - /* - * Handles edge cases with Unreal's JSON parsing - */ - void Setup(FJsonObject json_in) - { - Token = json_in.GetStringField(TEXT("token")); - } -}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h deleted file mode 100644 index 2ba86c7e1..000000000 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetQuoteReturn.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "SardineQuote.h" -#include "SardineGetQuoteReturn.generated.h" - -USTRUCT(BlueprintType) -struct SEQUENCEPLUGIN_API FSardineGetQuoteReturn -{ - GENERATED_USTRUCT_BODY() - - FSardineQuote Quote; - - bool customConstructor = false; // Flag to determine the constructor used - - // Dummy constructor method to maintain consistency - void construct(FJsonObject json_in) {} - - /* - * Handles edge cases with Unreal's JSON parsing - */ - void Setup(FJsonObject json_in) - { - Quote.Setup(*json_in.GetObjectField(TEXT("quote"))); - } -}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h deleted file mode 100644 index 8d1a0c595..000000000 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedFiatCurrenciesReturn.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "SardineFiatCurrency.h" -#include "SardineGetSupportedFiatCurrenciesReturn.generated.h" - -USTRUCT(BlueprintType) -struct SEQUENCEPLUGIN_API FSardineGetSupportedFiatCurrenciesReturn -{ - GENERATED_USTRUCT_BODY() - - TArray Currencies; - - bool customConstructor = false; // Flag to determine the constructor used - - // Dummy constructor method to maintain consistency - void construct(FJsonObject json_in) {} - - /* - * Handles edge cases with Unreal's JSON parsing - */ - void Setup(FJsonObject json_in) - { - const TArray>* CurrenciesJson; - if (json_in.TryGetArrayField(TEXT("tokens"), CurrenciesJson)) - { - Currencies.SetNum(CurrenciesJson->Num()); - - for (int32 i = 0; i < CurrenciesJson->Num(); i++) - { - TSharedPtr Currency = (*CurrenciesJson)[i]; - if (Currency.IsValid()) - { - TSharedPtr CurrencyObj = Currency->AsObject(); - Currencies[i].Setup(*CurrencyObj); - } - } - } - else - { - UE_LOG(LogTemp, Warning, TEXT("No tokens field found in the SardineGetSupportedFiatCurrencies response.")); - } - } -}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h deleted file mode 100644 index 2dc12e317..000000000 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetSupportedRegionsReturn.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "SardineRegion.h" -#include "SardineGetSupportedRegionsReturn.generated.h" - -USTRUCT(BlueprintType) -struct SEQUENCEPLUGIN_API FSardineGetSupportedRegionsReturn -{ - GENERATED_USTRUCT_BODY() - - TArray Regions; - - bool customConstructor = false; // Flag to determine the constructor used - - // Dummy constructor method to maintain consistency - void construct(FJsonObject json_in) {} - - /* - * Handles edge cases with Unreal's JSON parsing - */ - void Setup(FJsonObject json_in) - { - const TArray>* lst; - if (json_in.TryGetArrayField(TEXT("regions"), lst)) - { - Regions.SetNum(lst->Num()); - - for (int32 i = 0; i < lst->Num(); i++) - { - TSharedPtr item = (*lst)[i]; - - if (item.IsValid()) - { - TSharedPtr itemObj = item->AsObject(); - Regions[i].Setup(*itemObj); - } - } - } - else - { - UE_LOG(LogTemp, Warning, TEXT("No regions field found in the SardineGetSupportedRegions response.")); - } - } -}; From 787b4995f6014531e00d2b414c341857fd928bb6 Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Tue, 1 Apr 2025 11:28:13 -0400 Subject: [PATCH 41/48] ik/Fixing index out of bounds exception when encoding empty dynamic data --- .../Source/SequencePlugin/Private/ABI/ABIElement.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ABI/ABIElement.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ABI/ABIElement.cpp index 2799dbc2c..b555fb4e5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/ABI/ABIElement.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/ABI/ABIElement.cpp @@ -345,6 +345,11 @@ void TDynamicABIData::EncodeTail(TArray &Data, int HeadPosition, int Offs PushEmptyBlock(Data); CopyInUInt32(Data, MyData.Num(), BlockPos); + if (MyData.IsEmpty()) + { + return; + } + // Encode Data uint32 BlockLen = (MyData.Num() + GBlockByteLength - 1) / GBlockByteLength; Data.Append(&MyData[0], MyData.Num()); From 276ee82aea107e0b8e2debaeeb0c1566dc6dea54 Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Tue, 1 Apr 2025 11:29:53 -0400 Subject: [PATCH 42/48] ik/implementing ERC1155 endpoint with mock data --- .../Marketplace/Sardine/SardineCheckout.cpp | 186 ++++++++++++++++-- .../Private/Types/ERC1155SaleContract.cpp | 9 + .../Marketplace/Sardine/SardineCheckout.h | 29 ++- .../Structs/SardineGetNFTCheckoutTokenArgs.h | 40 ++-- .../SardineGetNFTCheckoutTokenResponse.h | 28 +++ .../Public/Types/ERC1155SaleContract.h | 3 +- .../SardineGetNFTCheckoutTokenTest.cpp | 80 ++++++++ .../SardineGetNFTCheckoutTokenTest.h | 24 +++ 8 files changed, 356 insertions(+), 43 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenResponse.h create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index cf88f00c1..ba3ffc230 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -8,6 +8,7 @@ #include "Interfaces/IHttpResponse.h" #include "Marketplace/Marketplace.h" #include "Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h" +#include "Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenResponse.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteArgs.h" #include "Marketplace/Sardine/Structs/SardineGetQuoteResponse.h" #include "Marketplace/Sardine/Structs/SardineSupportedFiatCurrenciesResponse.h" @@ -16,12 +17,116 @@ #include "Marketplace/Sardine/Structs/SardineTokenResponse.h" #include "Util/Log.h" +TArray PaymentMethods { + PaymentMethod_Us_Debit, + PaymentMethod_Us_Credit, + PaymentMethod_International_Debit, + PaymentMethod_International_Credit, + PaymentMethod_Ach +}; + +USardineCheckout::USardineCheckout(ENetwork Chain) +{ + _chain = Chain; +} + FString USardineCheckout::Url(const FString& EndPoint) const { return _baseUrl + "/" + EndPoint; } -void USardineCheckout::SardineGetNFTCHeckoutToken(FSardineGetNFTCheckoutTokenArgs Args, +void USardineCheckout::GetPaymentToken(UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, + int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) +{ + FString PaymentToken = SaleContract->PaymentToken; + GetPaymentDetails(PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, Proof, + OnSuccess, OnFailure); +} + +void USardineCheckout::GetPaymentDetails(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, + long TokenID, int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) +{ + FString PaymentTokenSymbol = "POL"; + long PaymentTokenDecimals = 6; + + GetCollectible(PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, + PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure); +} + +void USardineCheckout::GetCollectible(FString PaymentToken, UERC1155SaleContract* SaleContract, + FString CollectionAddress, long TokenID, int64 ChainID, FString RecipientAddress, long Amount, + FString PaymentTokenSymbol, long PaymentTokenDecimals, const TArray& Proof, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) +{ + UMarketplace* Marketplace = NewObject(); + Marketplace->GetCollectible(ChainID, CollectionAddress, FString::FromInt(TokenID), + [this, SaleContract, TokenID, ChainID, RecipientAddress, Amount, PaymentToken, PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure](const FSeqTokenMetaData& TokenMetaData) + { + GetSaleDetails(SaleContract, TokenID, TokenMetaData, ChainID, RecipientAddress, Amount, PaymentToken, + PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure); + }, OnFailure); +} + +void USardineCheckout::GetSaleDetails(UERC1155SaleContract* SaleContract, long TokenId, FSeqTokenMetaData TokenMetaData, + int64 ChainID, FString RecipientAddress, long Amount, FString PaymentToken, FString PaymentTokenSymbol, + long PaymentTokenDecimals, const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +{ + long Cost = 20000; + long SupplyCap = 9999999999999; + long StartTimeLong = 1723058097; + long EndTimeLong = 2448832492; + + if (Amount > SupplyCap) + { + Amount = SupplyCap; + } + if (StartTimeLong > FDateTime::UtcNow().ToUnixTimestamp()) + { + OnFailure(FSequenceError(RequestFail, FString::Printf(TEXT("Token id %d is not yet available for sale"), (int) TokenId))); + } + if (EndTimeLong < FDateTime::UtcNow().ToUnixTimestamp()) + { + OnFailure(FSequenceError(RequestFail, FString::Printf(TEXT("Token id %d is no longer available for sale"), (int) TokenId))); + } + + TArray TokenIds { (int32)TokenId }; + TArray Amounts { (int32)Amount }; + + FString CallData = SaleContract->MakePurchaseTransaction(RecipientAddress, TokenIds, Amounts, Proof).data; + + FSardinePaymentMethodTypeConfig PaymentConfig { + PaymentMethods, + PaymentMethod_Us_Debit + }; + + FSardineGetNFTCheckoutTokenArgs Args { + "", + 3600, + PaymentConfig, + TokenMetaData.name, + TokenMetaData.image, + USequenceSupport::GetNetworkNameForUrl(ChainID), + RecipientAddress, + SaleContract->ContractAddress, + "calldata_execution", + "smart_contract", + FString::FromInt(TokenId), + Amount, + (uint)TokenMetaData.decimals, + FString::FromInt(Cost), + PaymentToken, + PaymentTokenSymbol, + PaymentTokenDecimals, + CallData + }; + + SardineGetNFTCheckoutToken(Args, OnSuccess, OnFailure); +} + + +void USardineCheckout::SardineGetNFTCheckoutToken(const FSardineGetNFTCheckoutTokenArgs& Args, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) { if(Args.TokenAddress == FAddress::New().ToHex()) @@ -32,8 +137,8 @@ void USardineCheckout::SardineGetNFTCHeckoutToken(FSardineGetNFTCheckoutTokenArg HTTPPost("SardineGetNFTCheckoutToken", BuildArgs(Args), [this, OnSuccess](const FString& Content) { - const FSardineNFTCheckout Response = this->BuildResponse(Content); - OnSuccess(Response); + const FSardineGetNFTCheckoutTokenResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Checkout); }, OnFailure); } @@ -103,7 +208,53 @@ void USardineCheckout::HTTPPost(const FString& Endpoint, const FString& Args, void USardineCheckout::CheckSardineWhiteListStatus(FString Address, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) { - + const FString Endpoint = "SardineGetNFTCheckoutToken"; + + FString CheckWhiteListStatusUrl = Url(Endpoint); + FString ReferenceId = "sequence-unity-sardine-whitelist-check"; + FString Name = "whitelist-check"; + FString ImageUrl = "https://www.sequence.market/images/placeholder.png"; + FString Platform = "calldata_execution"; + FString ExecutionType = "smart_contract"; + FString BlockchainNFTId = "42"; + uint Quantity = 1; + uint Decimals = 0; + FString TokenAmount = "1000000"; + FString TokenAddress = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"; + FString TokenSymbol = "USDC"; + uint TokenDecimals = 6; + FString CallData = "0x1"; + + FSardinePaymentMethodTypeConfig PaymentConfig { + PaymentMethods, + ESardinePaymentMethod::PaymentMethod_Us_Debit + }; + + FSardineGetNFTCheckoutTokenArgs Args { + ReferenceId, + 3600, + PaymentConfig, + Name, + ImageUrl, + USequenceSupport::GetNetworkName(_chain), + FAddress::New().ToHex(), + Address, + Platform, + ExecutionType, + BlockchainNFTId, + Quantity, + Decimals, + TokenAmount, + TokenAddress, + TokenSymbol, + TokenDecimals, + CallData + }; + + HTTPPost(Endpoint, BuildArgs(Args), [this, OnSuccess](const FString& Content) + { + OnSuccess(true); + }, OnFailure); } void USardineCheckout::SardineGetQuote(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString WalletAddress, FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType, @@ -153,6 +304,11 @@ void USardineCheckout::SardineGetNFTCheckoutToken(TArray O FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) { + if (RecipientAddress.IsEmpty()) + { + // set to wallet address + } + if(Orders.Num() < 1) { OnFailure(FSequenceError(InvalidArgument, "Orders must contain at least one collectible")); @@ -168,28 +324,22 @@ void USardineCheckout::SardineGetNFTCheckoutToken(TArray O //TODO Generate steps from checkout } -void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract SaleContract, FString CollectionAddress, +void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, - FString RecipientAddress, TArray data, TArray Proof) + FString RecipientAddress, TArray data, TArray Proof) { + if (RecipientAddress.IsEmpty()) + { + // set address to wallet address + } + if(Amount < 1) { OnFailure(FSequenceError(InvalidArgument, "Amount must be greater than 0")); return; } - - UMarketplace* Marketplace = NewObject(); - - Marketplace->GetCollectible(ChainId, CollectionAddress, FString::FromInt(TokenID), [this, &SaleContract, Amount, OnSuccess, RecipientAddress, data, Proof](FSeqTokenMetaData MetaData) - { - //TODO - }, [OnFailure](FSequenceError Error) - { - SEQ_LOG_EDITOR(Error, TEXT("Failed to get collectible: %s"), *Error.Message); - OnFailure(Error); - }); - //FSeqTokenMetaData metaData = + GetPaymentToken(SaleContract, CollectionAddress, TokenID, ChainId, RecipientAddress, Amount, Proof, OnSuccess, OnFailure); } void USardineCheckout::SardineGetSupportedRegions(TSuccessCallback> OnSuccess, diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp index 6618d7e25..876f4cea7 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp @@ -14,6 +14,15 @@ UERC1155SaleContract::UERC1155SaleContract(FString ContractAddress, FString Paym this->Data = Data; } +void UERC1155SaleContract::Initialize(FString _ContractAddress, FString _PaymentToken, int32 _MaxTotal, FString _Data) +{ + this->ContractAddress = _ContractAddress; + this->PaymentToken = _PaymentToken; + this->MaxTotal = _MaxTotal; + this->Data = _Data; +} + + FRawTransaction UERC1155SaleContract::MakePurchaseTransaction(const FString& ToAddress, const TArray& TokenIds, const TArray& Amounts, const TArray& Proof) { FString FunctionSignature = "mint(address,uint256[],uint256[],bytes,address,uint256,bytes32[])"; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index c15ba91f7..f5ba206d7 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -5,9 +5,11 @@ #include "CoreMinimal.h" #include "Checkout/Structs/AdditionalFee.h" #include "Marketplace/Structs/SeqCollectibleOrder.h" +#include "Sequence/SequenceAPI.h" #include "Structs/SardineEnabledToken.h" #include "Structs/SardineFiatCurrency.h" #include "Structs/SardineGetNFTCheckoutTokenArgs.h" +#include "Structs/SardineGetQuoteArgs.h" #include "Structs/SardineNFTCheckout.h" #include "Structs/SardineOrder.h" #include "Structs/SardinePaymentType.h" @@ -43,13 +45,32 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject FString _baseUrl = _prodUrl; FString _baseCheckoutUrl = _sardineCheckoutUrl; + ENetwork _chain; FString Url(const FString& EndPoint) const; - void SardineGetNFTCHeckoutToken(FSardineGetNFTCheckoutTokenArgs Args, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void GetPaymentToken(UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, int64 ChainID, + FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure); + + void GetPaymentDetails(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, + long TokenID, int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void GetCollectible(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, + long TokenID, int64 ChainID, FString RecipientAddress, long Amount, FString PaymentTokenSymbol, long PaymentTokenDecimals, + const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void GetSaleDetails(UERC1155SaleContract* SaleContract, long TokenId, FSeqTokenMetaData TokenMetaData, int64 ChainID, + FString RecipientAddress, long Amount, FString PaymentToken, FString PaymentTokenSymbol, long PaymentTokenDecimals, + const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void SardineGetNFTCheckoutToken(const FSardineGetNFTCheckoutTokenArgs& Args, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); public: //public functions + USardineCheckout(){} + USardineCheckout(ENetwork Chain); /* Here we take in text and convert it to a Struct of type T if possible @@ -85,9 +106,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void SardineGetNFTCheckoutToken(TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback - OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = - TArray(), TArray Proof = TArray()); + void SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, long Amount, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", + TArray data = TArray(), TArray Proof = TArray()); void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h index 0df7c1d85..cf3e9286c 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h @@ -43,25 +43,25 @@ struct SEQUENCEPLUGIN_API FSardineGetNFTCheckoutTokenArgs { FJsonBuilder Builder; - Builder.AddString(TEXT("ReferenceId"), ReferenceId); - Builder.AddInt(TEXT("ExpiresIn"), ExpiresIn); - Builder.AddField(TEXT("PaymentMethodTypeConfig"), PaymentMethodTypeConfig.GetArgs()); - Builder.AddString(TEXT("Name"), Name); - Builder.AddString(TEXT("ImageUrl"), ImageUrl); - Builder.AddString(TEXT("Network"), Network); - Builder.AddString(TEXT("RecipientAddress"), RecipientAddress); - Builder.AddString(TEXT("ContractAddress"), ContractAddress); - Builder.AddString(TEXT("Platform"), Platform); - Builder.AddString(TEXT("ExecutionType"), ExecutionType); - Builder.AddString(TEXT("BlockchainNftId"), BlockchainNftId); - Builder.AddInt(TEXT("Quantity"), Quantity); - Builder.AddInt(TEXT("Decimals"), Decimals); - Builder.AddString(TEXT("TokenAmount"), TokenAmount); - Builder.AddString(TEXT("TokenAddress"), TokenAddress); - Builder.AddString(TEXT("TokenSymbol"), TokenSymbol); - Builder.AddInt(TEXT("TokenDecimals"), TokenDecimals); - Builder.AddString(TEXT("CallData"), CallData); - - return Builder.ToString(); + Builder.AddString(TEXT("name"), Name); + Builder.AddString(TEXT("imageUrl"), ImageUrl); + Builder.AddString(TEXT("network"), Network); + Builder.AddString(TEXT("recipientAddress"), RecipientAddress); + Builder.AddString(TEXT("blockchainNftId"), BlockchainNftId); + Builder.AddString(TEXT("contractAddress"), ContractAddress); + Builder.AddInt(TEXT("decimals"), Decimals); + Builder.AddInt(TEXT("quantity"), Quantity); + Builder.AddString(TEXT("tokenAmount"), TokenAmount); + Builder.AddString(TEXT("tokenAddress"), TokenAddress); + Builder.AddString(TEXT("tokenSymbol"), TokenSymbol); + Builder.AddInt(TEXT("tokenDecimals"), TokenDecimals); + Builder.AddString(TEXT("callData"), CallData); + Builder.AddString(TEXT("platform"), Platform); + + // Builder.AddInt(TEXT("expiresIn"), ExpiresIn); + // Builder.AddString(TEXT("referenceId"), ReferenceId); + + FString Params = "{\"params\":" + Builder.ToString() + "}"; + return Params; } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenResponse.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenResponse.h new file mode 100644 index 000000000..c69ed0da4 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenResponse.h @@ -0,0 +1,28 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "UObject/Object.h" +#include "SardineNFTCheckout.h" +#include "SardineGetNFTCheckoutTokenResponse.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSardineGetNFTCheckoutTokenResponse +{ + GENERATED_USTRUCT_BODY() + +public: + FSardineNFTCheckout Checkout; + + bool customConstructor = false; + + void construct(FJsonObject& json_in) {} + void Setup(FJsonObject& json_in) + { + const auto CheckoutObject = json_in.GetObjectField(TEXT("resp")); + Checkout.Setup(*CheckoutObject); + } +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h index 17b824b0e..501d4d942 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h @@ -31,7 +31,8 @@ class SEQUENCEPLUGIN_API UERC1155SaleContract : public UObject UFUNCTION(BlueprintCallable, Category = "ERC1155 Sale") FRawTransaction MakePurchaseTransaction(const FString& ToAddress, const TArray& TokenIds, const TArray& Amounts, const TArray& Proof); - + void Initialize(FString _ContractAddress, FString _PaymentToken, int32 _MaxTotal, FString _Data); + FContractCall GetPaymentToken(); FContractCall GetGlobalSaleDetails(); diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp new file mode 100644 index 000000000..8d62fb623 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp @@ -0,0 +1,80 @@ +#include "SardineGetNFTCheckoutTokenTest.h" +#include "CoreMinimal.h" +#include "Misc/AutomationTest.h" +#include "Engine/World.h" +#include "Marketplace/Sardine/SardineCheckout.h" +#include "Tests/AutomationCommon.h" +#include "Tests/AutomationEditorCommon.h" +#include "Util/Async.h" + +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineGetNFTCheckoutTokenTest, "SequencePlugin.EndToEnd.SardineTests.GetNFTCheckoutTokenTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +void FSardineGetNFTCheckoutTokenTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +{ + OutBeautifiedNames.Add(TEXT("Sardine Get NFT Checkout Token Test")); + OutTestCommands.Add(TEXT("")); +} + +bool FSardineGetNFTCheckoutTokenTest::RunTest(const FString& Parameters) +{ + AddInfo(TEXT("Starting Sardine Get NFT CHeckout Token Test")); + + // Start PIE + ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); + + // Wait for PIE to initialize + ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(1.0f)); + + // Run the actual test + ADD_LATENT_AUTOMATION_COMMAND(FFunctionLatentCommand([this]() + { + USardineGetNFTCheckoutTokenTestHelper* TestHelper = NewObject(); + TestHelper->ParentTest = this; + TestHelper->RunTest(); + + ADD_LATENT_AUTOMATION_COMMAND(FWaitForGetNFTCheckoutToken(TestHelper)); + return true; + })); + return true; +} + +void USardineGetNFTCheckoutTokenTestHelper::RunTest() +{ + Checkout = NewObject(); + + // mock data + int64 ChainID = 137; + UERC1155SaleContract* SaleContract = NewObject(); + SaleContract->Initialize("0xe65b75eb7c58ffc0bf0e671d64d0e1c6cd0d3e5b", "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", 99999, ""); + + FString CollectionAddress = "0xdeb398f41ccd290ee5114df7e498cf04fac916cb"; + long TokenID = 1; + long Amount = 1; + FString RecipientAddress = "0x9886910Faec24328FE8104a300e5D08FF0B5675b"; + TArray Proof; + TArray Data; + Proof.Empty(); + Data.Empty(); + + const TSuccessCallback GetNFTCheckoutTokenSuccess = [this](const FSardineNFTCheckout& Token) + { + bTestComplete = true; + const FString Message = "Sardine NFT Checkout Token request succeeded with token"; + ParentTest->AddInfo(FString::Printf(TEXT("%s: %s"), *Message, *Token.Token)); + }; + + const FFailureCallback GetNFTCheckoutTokenFailure = [this](const FSequenceError& Error) + { + bTestComplete = true; + const FString Message = "Request Failure"; + ParentTest->AddError(FString::Printf(TEXT("%s: %s."), *Message, *Error.Message)); + }; + + Checkout->SardineGetNFTCheckoutToken(ChainID, SaleContract, CollectionAddress, TokenID, Amount, + GetNFTCheckoutTokenSuccess, GetNFTCheckoutTokenFailure, RecipientAddress, Data, Proof); +} + +bool FWaitForGetNFTCheckoutToken::Update() +{ + return TestHelper->IsTestComplete(); +} diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h new file mode 100644 index 000000000..d8f56f779 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h @@ -0,0 +1,24 @@ +#pragma once +#include "Marketplace/Sardine/SardineCheckout.h" + +#include "SardineGetNFTCheckoutTokenTest.generated.h" + +class FSardineGetNFTCheckoutTokenTest; + +UCLASS() +class USardineGetNFTCheckoutTokenTestHelper : public UObject +{ + GENERATED_BODY() + +public: + void RunTest(); + bool IsTestComplete() const { return bTestComplete; } + + FSardineGetNFTCheckoutTokenTest* ParentTest; + +private: + bool bTestComplete = false; + USardineCheckout* Checkout = nullptr; +}; + +DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForGetNFTCheckoutToken, USardineGetNFTCheckoutTokenTestHelper*, TestHelper); From a7117813c3441e9b0ade784c48967c1f8b676fa2 Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Thu, 3 Apr 2025 12:55:53 -0400 Subject: [PATCH 43/48] ik/Adding payment details eth call instead of mock data --- .../Marketplace/Sardine/SardineCheckout.cpp | 53 ++++++++++++++----- .../SequencePlugin/Private/Provider.cpp | 27 ++++++++++ .../Source/SequencePlugin/Private/Provider.h | 2 + .../Private/Sequence/SequenceAPI.cpp | 8 +++ .../Private/Types/ERC1155SaleContract.cpp | 16 ++++++ .../SequencePlugin/Private/Types/ERC20.cpp | 31 +++++++++++ .../Private/Util/SequenceSupport.cpp | 10 ++++ .../Marketplace/Sardine/SardineCheckout.h | 11 ++-- .../Public/Sequence/SequenceAPI.h | 3 ++ .../Public/Types/ERC1155SaleContract.h | 2 +- .../SequencePlugin/Public/Types/ERC20.h | 7 +++ .../Public/Util/SequenceSupport.h | 52 ++++++++++++++++++ 12 files changed, 205 insertions(+), 17 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index ba3ffc230..d6ca6b4b4 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -15,6 +15,7 @@ #include "Marketplace/Sardine/Structs/SardineSupportedRegionsResponse.h" #include "Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h" #include "Marketplace/Sardine/Structs/SardineTokenResponse.h" +#include "Types/ERC20.h" #include "Util/Log.h" TArray PaymentMethods { @@ -25,9 +26,13 @@ TArray PaymentMethods { PaymentMethod_Ach }; -USardineCheckout::USardineCheckout(ENetwork Chain) +USardineCheckout::USardineCheckout() { - _chain = Chain; + const TOptional WalletOptional = USequenceWallet::Get(); + if (WalletOptional.IsSet() && WalletOptional.GetValue()) + { + _wallet = WalletOptional.GetValue(); + } } FString USardineCheckout::Url(const FString& EndPoint) const @@ -40,19 +45,40 @@ void USardineCheckout::GetPaymentToken(UERC1155SaleContract* SaleContract, FStri const FFailureCallback& OnFailure) { FString PaymentToken = SaleContract->PaymentToken; - GetPaymentDetails(PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, Proof, - OnSuccess, OnFailure); + + GetPaymentDetails(PaymentToken, [this, PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, Proof, OnSuccess, OnFailure](TTuple PaymentDetails) + { + FString PaymentTokenSymbol = PaymentDetails.Get<0>(); + long PaymentTokenDecimals = PaymentDetails.Get<1>(); + + GetCollectible(PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure); + }, OnFailure); } -void USardineCheckout::GetPaymentDetails(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, - long TokenID, int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure) +void USardineCheckout::GetPaymentDetails(FString PaymentToken, TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure) { - FString PaymentTokenSymbol = "POL"; - long PaymentTokenDecimals = 6; - - GetCollectible(PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, - PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure); + if (PaymentToken == FAddress::New().ToHex()) + { + FString PaymentTokenSymbol = "POL"; + long PaymentTokenDecimals = 18; + OnSuccess(TTuple(PaymentTokenSymbol, PaymentTokenDecimals)); + } + else + { + UERC20* PaymentTokenContract = NewObject(); + PaymentTokenContract->Initialize(PaymentToken); + FContractCall SymbolCall = PaymentTokenContract->MakeSymbolTransaction(); + _wallet->Call(SymbolCall, [this, PaymentTokenContract, OnSuccess, OnFailure](FUnsizedData Data) + { + FString PaymentTokenSymbol = UTF8ToString(Data); + FContractCall DecimalsCall = PaymentTokenContract->MakeDecimalsTransaction(); + _wallet->Call(DecimalsCall, [this, PaymentTokenSymbol, OnSuccess](FUnsizedData Data) + { + long PaymentTokenDecimals = FCString::Atoi64(*UTF8ToString(Data)); + OnSuccess(TTuple(PaymentTokenSymbol, PaymentTokenDecimals)); + }, OnFailure); + }, OnFailure); + } } void USardineCheckout::GetCollectible(FString PaymentToken, UERC1155SaleContract* SaleContract, @@ -214,6 +240,7 @@ void USardineCheckout::CheckSardineWhiteListStatus(FString Address, TSuccessCall FString ReferenceId = "sequence-unity-sardine-whitelist-check"; FString Name = "whitelist-check"; FString ImageUrl = "https://www.sequence.market/images/placeholder.png"; + int64 ChainID = _wallet->GetNetworkId(); FString Platform = "calldata_execution"; FString ExecutionType = "smart_contract"; FString BlockchainNFTId = "42"; @@ -236,7 +263,7 @@ void USardineCheckout::CheckSardineWhiteListStatus(FString Address, TSuccessCall PaymentConfig, Name, ImageUrl, - USequenceSupport::GetNetworkName(_chain), + USequenceSupport::GetNetworkName(ChainID), FAddress::New().ToHex(), Address, Platform, diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp index a1ab35efc..bfcf25c2d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp @@ -386,12 +386,39 @@ void UProvider::Call(const FContractCall& ContractCall, const EBlockTag Number, return CallHelper(ContractCall, ConvertString(UEnum::GetValueAsString(Number)), OnSuccess, OnFailure); } +void UProvider::Call(const FContractCall& ContractCall, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) +{ + return CallHelper(ContractCall, OnSuccess, OnFailure); +} + void UProvider::NonViewCall(FEthTransaction Transaction, const FPrivateKey& PrivateKey, const int ChainID, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) { const FUnsizedData SignedTransaction = Transaction.GetSignedTransaction(PrivateKey, ChainID); return SendRawTransaction("0x" + SignedTransaction.ToHex(), OnSuccess, OnFailure); } +void UProvider::CallHelper(FContractCall ContractCall, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) +{ + const FString Content = RPCBuilder("eth_call").ToPtr() + ->AddArray("params").ToPtr() + ->AddValue(ContractCall.GetJson()) + ->EndArray() + ->ToString(); + + const FString MyUrl = this->Url; + this->SendRPCAndExtract(Url, Content, OnSuccess, [MyUrl](const FString& Response) + { + TResult StringResult = Make(MyUrl)->ExtractStringResult(Response); + + if(!StringResult.HasError()) + { + return TResult(MakeValue(HexStringToBinary(StringResult.GetValue()))); + } + + return TResult(MakeError(FSequenceError(ResponseParseError, ""))); + }, OnFailure); +} + void UProvider::CallHelper(FContractCall ContractCall, const FString& Number, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) { const FString Content = RPCBuilder("eth_call").ToPtr() diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h index 6872ac1f9..b8f0c731a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h @@ -28,6 +28,7 @@ class SEQUENCEPLUGIN_API UProvider : public URPCCaller void BlockByNumberHelper(const FString& Number, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); void HeaderByNumberHelper(const FString& Number, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void NonceAtHelper(const FString& Number, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void CallHelper(FContractCall ContractCall, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); void CallHelper(FContractCall ContractCall, const FString& Number, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); void Init(const FString& UrlIn); public: @@ -62,5 +63,6 @@ class SEQUENCEPLUGIN_API UProvider : public URPCCaller void Call(const FContractCall& ContractCall, const uint64 Number, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); void Call(const FContractCall& ContractCall, const EBlockTag Number, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); + void Call(const FContractCall& ContractCall, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); void NonViewCall(FEthTransaction Transaction, const FPrivateKey& PrivateKey, const int ChainID, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure); }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index d4cf5f6f1..7e9d72d11 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -750,6 +750,14 @@ void USequenceWallet::Call(const FContractCall& ContractCall, EBlockTag Number, } } +void USequenceWallet::Call(const FContractCall& ContractCall, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const +{ + if (this->Provider) + { + this->Provider->Call(ContractCall,OnSuccess,OnFailure); + } +} + void USequenceWallet::NonViewCall(const FEthTransaction& Transaction, const FPrivateKey& PrivateKey, int ChainID, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const { if (this->Provider) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp index 876f4cea7..dedaf20f3 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp @@ -115,3 +115,19 @@ FContractCall UERC1155SaleContract::GetGlobalSaleDetails() return CallData; } + +FContractCall UERC1155SaleContract::GetTokenSaleDetails(long TokenID) +{ + FString FunctionSignature = "tokenSaleDetails(uint256)"; + TFixedABIData* TokenIDData = new TFixedABIData(ABI::Int32(TokenID)); + + TArray Arr; + Arr.Add(TokenIDData); + FUnsizedData EncodedData = ABI::Encode(FunctionSignature, Arr); + + FContractCall CallData; + CallData.Data = TOptional(EncodedData.ToHex()); + CallData.To = FAddress::From(ContractAddress); + + return CallData; +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp index a675583ed..5c221ad96 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp @@ -10,6 +10,11 @@ UERC20::UERC20(FString ContractAddress) this->ContractAddress = ContractAddress; } +void UERC20::Initialize(FString _contractAddress) +{ + this->ContractAddress = _contractAddress; +} + FRawTransaction UERC20::MakeGrantRoleTransaction(const FString& role,const FString& ToAddress) { FString FunctionSignature = "grantRole(bytes32,address)"; @@ -116,3 +121,29 @@ FRawTransaction UERC20::MakeBurnTransaction(const int32 Amount) return T; } + +FContractCall UERC20::MakeSymbolTransaction() +{ + FString FunctionSignature = "symbol()"; + TArray Arr; + FUnsizedData EncodedData = ABI::Encode(FunctionSignature, Arr); + + FContractCall T; + T.To = FAddress::From(ContractAddress); + T.Data = TOptional(EncodedData.ToHex()); + + return T; +} + +FContractCall UERC20::MakeDecimalsTransaction() +{ + FString FunctionSignature = "decimals()"; + TArray Arr; + FUnsizedData EncodedData = ABI::Encode(FunctionSignature, Arr); + + FContractCall T; + T.To = FAddress::From(ContractAddress); + T.Data = TOptional(EncodedData.ToHex()); + + return T; +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp index 093efe6f7..928619c81 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp @@ -39,6 +39,16 @@ FString USequenceSupport::GetNetworkNameForUrl(const int64 NetworkIdIn) return TEXT(""); } +FString USequenceSupport::GetNetworkSymbol(const ENetwork NetworkIn) +{ + if (NetworkEnumToSymbolMap.Contains(NetworkIn)) + { + return *NetworkEnumToSymbolMap.Find(NetworkIn); + } + UE_LOG(LogTemp, Warning, TEXT("Name not found for Id: %lld"), NetworkIn); + return TEXT(""); +} + bool USequenceSupport::IsNetworkIdSupported(const int64 NetworkIdIn) { return NetworkIdToNameMap.Contains(NetworkIdIn); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index f5ba206d7..d3522de09 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -42,10 +42,10 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject const FString _devUrl = "https://dev-api.sequence.app/rpc/API"; const FString _prodUrl = "https://api.sequence.app/rpc/API"; - FString _baseUrl = _prodUrl; + FString _baseUrl = _devUrl; FString _baseCheckoutUrl = _sardineCheckoutUrl; - ENetwork _chain; + USequenceWallet* _wallet = nullptr; FString Url(const FString& EndPoint) const; @@ -53,9 +53,14 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void GetPaymentDetails(FString PaymentToken, TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + void GetPaymentDetails(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + void GetCollectible(int64 ChainID, FString CollectionAddress, long TokenID, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void GetCollectible(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, int64 ChainID, FString RecipientAddress, long Amount, FString PaymentTokenSymbol, long PaymentTokenDecimals, @@ -69,7 +74,7 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject public: //public functions - USardineCheckout(){} + USardineCheckout(); USardineCheckout(ENetwork Chain); /* diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h index b231a7a4d..8988c98ef 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h @@ -359,6 +359,9 @@ class SEQUENCEPLUGIN_API USequenceWallet : public UGameInstanceSubsystem void Call(const FContractCall& ContractCall, EBlockTag Number, const TFunction& OnSuccess, const TFunction& OnFailure) const; + + void Call(const FContractCall& ContractCall, const TFunction& OnSuccess, + const TFunction& OnFailure) const; void NonViewCall(const FEthTransaction& Transaction, const FPrivateKey& PrivateKey, int ChainID, const TFunction& OnSuccess, const TFunction& OnFailure) const; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h index 501d4d942..74e106e8f 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h @@ -37,5 +37,5 @@ class SEQUENCEPLUGIN_API UERC1155SaleContract : public UObject FContractCall GetGlobalSaleDetails(); - + FContractCall GetTokenSaleDetails(long TokenID); }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC20.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC20.h index 895aaff87..86baca228 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC20.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC20.h @@ -1,6 +1,7 @@ #pragma once #include "CoreMinimal.h" +#include "ContractCall.h" #include "UObject/Object.h" #include "Sequence/Transactions.h" #include "ERC20.generated.h" @@ -17,6 +18,8 @@ class SEQUENCEPLUGIN_API UERC20 : public UObject UERC20(FString ContractAddress); + void Initialize(FString ContractAddress); + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn = true), Category = "ERC20") FString ContractAddress; @@ -31,5 +34,9 @@ class SEQUENCEPLUGIN_API UERC20 : public UObject UFUNCTION(BlueprintCallable, Category = "ERC20") FRawTransaction MakeBurnTransaction(const int32 Amount); + + FContractCall MakeSymbolTransaction(); + + FContractCall MakeDecimalsTransaction(); }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h index 9640efc1e..e6dc18c12 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h @@ -298,6 +298,56 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject {ENetwork::EtherlinkTestnet, TEXT("Etherlink Testnet")}, }; + static inline TMap NetworkEnumToSymbolMap = { + {ENetwork::Ethereum, TEXT("ETH")}, + {ENetwork::Immutable, TEXT("IMX")}, + {ENetwork::SkaleNebula, TEXT("sFUEL")}, + {ENetwork::Optimism, TEXT("OP")}, + {ENetwork::BNBSmartChain, TEXT("BNB")}, + {ENetwork::GnosisChain, TEXT("xDai")}, + {ENetwork::PolygonChain, TEXT("POL")}, + {ENetwork::PolygonZkEVM, TEXT("POL")}, + {ENetwork::B3, TEXT("ETH")}, + {ENetwork::Base, TEXT("ETH")}, + {ENetwork::OasysHomeverse, TEXT("OAS")}, + {ENetwork::APEChain, TEXT("APE")}, + {ENetwork::ArbitrumOne, TEXT("AETH")}, + {ENetwork::ArbitrumNova, TEXT("AETH")}, + {ENetwork::Avalanche, TEXT("AVAX")}, + {ENetwork::Blast, TEXT("ETH")}, + {ENetwork::Xai, TEXT("XAI")}, + {ENetwork::LAOS, TEXT("LAOS")}, + {ENetwork::Root, TEXT("XRP")}, + {ENetwork::Soneium, TEXT("ETH")}, + {ENetwork::Telos, TEXT("TLOS")}, + {ENetwork::Moonbeam, TEXT("GLMR")}, + {ENetwork::Etherlink, TEXT("XTZ")}, + {ENetwork::XR1, TEXT("XR1")}, + + {ENetwork::ImmutableTestnet, TEXT("IMX")}, + {ENetwork::BNBSmartChainTestnet, TEXT("BNB")}, + {ENetwork::SoneiumMinatoTestnet, TEXT("ETH")}, + {ENetwork::B3Sepolia, TEXT("ETH")}, + {ENetwork::XRSepolia, TEXT("tXR")}, + {ENetwork::APEChainTestnet, TEXT("APE")}, + {ENetwork::OasysHomeverseTestnet, TEXT("OAS")}, + {ENetwork::AvalancheTestnet, TEXT("AVAX")}, + {ENetwork::PolygonAmoy, TEXT("POL")}, + {ENetwork::BaseSepolia, TEXT("ETH")}, + {ENetwork::ArbitrumSepolia, TEXT("AETH")}, + {ENetwork::Sepolia, TEXT("Sepolia")}, + {ENetwork::OptimismSepolia, TEXT("OP")}, + {ENetwork::TOYTestnet, TEXT("TOY")}, + {ENetwork::SKALENebulaGamingHubTestnet, TEXT("sFUEL")}, + {ENetwork::BlastSepolia, TEXT("ETH")}, + {ENetwork::XaiSepolia, TEXT("sXAI")}, + {ENetwork::LAOSSigma, TEXT("SIGMA")}, + {ENetwork::RootPorcini, TEXT("XRP")}, + {ENetwork::TelosTestnet, TEXT("TLOS")}, + {ENetwork::MoonbaseAlpha, TEXT("DEV")}, + {ENetwork::EtherlinkTestnet, TEXT("XTZ")}, + }; + public: /** @@ -312,6 +362,8 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject static FString GetNetworkNameForUrl(const int64 NetworkIdIn); + static FString GetNetworkSymbol(const ENetwork NetworkIn); + static bool IsNetworkIdSupported(const int64 NetworkIdIn); /** From a1f1544426ac17c8fd9d4d9ac07a4c57fb76d485 Mon Sep 17 00:00:00 2001 From: Inha Kim Date: Tue, 8 Apr 2025 15:01:56 -0400 Subject: [PATCH 44/48] ik/finalizing ER721 endpoint; implementing test; some code cleanup --- .../Marketplace/Sardine/SardineCheckout.cpp | 289 ++++++++++++------ .../SequencePlugin/Private/Provider.cpp | 8 + .../Source/SequencePlugin/Private/Provider.h | 4 + .../Private/Sequence/SequenceAPI.cpp | 9 + .../Private/Types/ERC1155SaleContract.cpp | 6 +- .../SequencePlugin/Private/Types/ERC20.cpp | 17 +- .../Private/Types/ERC721SaleContract.cpp | 9 +- .../Private/Types/SaleDetails.cpp | 11 + .../Public/Indexer/Structs/SeqTokenMetaData.h | 5 - .../Marketplace/Sardine/SardineCheckout.h | 24 +- .../Public/Sequence/SequenceAPI.h | 6 + .../Public/Types/ERC721SaleContract.h | 2 + .../SequencePlugin/Public/Types/SaleDetails.h | 21 ++ ...pp => SardineERC1155CheckoutTokenTest.cpp} | 20 +- .../SardineERC1155CheckoutTokenTest.h | 24 ++ .../SardineERC721CheckoutTokenTest.cpp | 80 +++++ .../SardineERC721CheckoutTokenTest.h | 24 ++ .../SardineGetNFTCheckoutTokenTest.h | 24 -- 18 files changed, 419 insertions(+), 164 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/SaleDetails.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/SaleDetails.h rename Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/{SardineGetNFTCheckoutTokenTest.cpp => SardineERC1155CheckoutTokenTest.cpp} (71%) create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.h create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.cpp create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.h delete mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index d6ca6b4b4..397847b4a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -16,6 +16,7 @@ #include "Marketplace/Sardine/Structs/SardineSupportedTokensResponse.h" #include "Marketplace/Sardine/Structs/SardineTokenResponse.h" #include "Types/ERC20.h" +#include "Types/SaleDetails.h" #include "Util/Log.h" TArray PaymentMethods { @@ -40,21 +41,6 @@ FString USardineCheckout::Url(const FString& EndPoint) const return _baseUrl + "/" + EndPoint; } -void USardineCheckout::GetPaymentToken(UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, - int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure) -{ - FString PaymentToken = SaleContract->PaymentToken; - - GetPaymentDetails(PaymentToken, [this, PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, Proof, OnSuccess, OnFailure](TTuple PaymentDetails) - { - FString PaymentTokenSymbol = PaymentDetails.Get<0>(); - long PaymentTokenDecimals = PaymentDetails.Get<1>(); - - GetCollectible(PaymentToken, SaleContract, CollectionAddress, TokenID, ChainID, RecipientAddress, Amount, PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure); - }, OnFailure); -} - void USardineCheckout::GetPaymentDetails(FString PaymentToken, TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure) { if (PaymentToken == FAddress::New().ToHex()) @@ -65,90 +51,50 @@ void USardineCheckout::GetPaymentDetails(FString PaymentToken, TSuccessCallback< } else { - UERC20* PaymentTokenContract = NewObject(); - PaymentTokenContract->Initialize(PaymentToken); - FContractCall SymbolCall = PaymentTokenContract->MakeSymbolTransaction(); - _wallet->Call(SymbolCall, [this, PaymentTokenContract, OnSuccess, OnFailure](FUnsizedData Data) - { - FString PaymentTokenSymbol = UTF8ToString(Data); - FContractCall DecimalsCall = PaymentTokenContract->MakeDecimalsTransaction(); - _wallet->Call(DecimalsCall, [this, PaymentTokenSymbol, OnSuccess](FUnsizedData Data) - { - long PaymentTokenDecimals = FCString::Atoi64(*UTF8ToString(Data)); - OnSuccess(TTuple(PaymentTokenSymbol, PaymentTokenDecimals)); - }, OnFailure); - }, OnFailure); + OnSuccess(TTuple("USDC", 6)); // TODO: Use commented logic once ABI decoding is fixed + + // UERC20* PaymentTokenContract = NewObject(); + // PaymentTokenContract->Initialize(PaymentToken); + // FContractCall SymbolCall = PaymentTokenContract->MakeSymbolTransaction(); + // _wallet->Call(SymbolCall, [this, PaymentTokenContract, OnSuccess, OnFailure](FUnsizedData Data) + // { + // FString PaymentTokenSymbol = UTF8ToString(Data); + // FContractCall DecimalsCall = PaymentTokenContract->MakeDecimalsTransaction(); + // _wallet->Call(DecimalsCall, [this, PaymentTokenSymbol, OnSuccess](FUnsizedData Data) + // { + // long PaymentTokenDecimals = FCString::Atoi64(*UTF8ToString(Data)); + // OnSuccess(TTuple(PaymentTokenSymbol, PaymentTokenDecimals)); + // }, OnFailure); + // }, OnFailure); } } -void USardineCheckout::GetCollectible(FString PaymentToken, UERC1155SaleContract* SaleContract, - FString CollectionAddress, long TokenID, int64 ChainID, FString RecipientAddress, long Amount, - FString PaymentTokenSymbol, long PaymentTokenDecimals, const TArray& Proof, TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure) -{ - UMarketplace* Marketplace = NewObject(); - Marketplace->GetCollectible(ChainID, CollectionAddress, FString::FromInt(TokenID), - [this, SaleContract, TokenID, ChainID, RecipientAddress, Amount, PaymentToken, PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure](const FSeqTokenMetaData& TokenMetaData) - { - GetSaleDetails(SaleContract, TokenID, TokenMetaData, ChainID, RecipientAddress, Amount, PaymentToken, - PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure); - }, OnFailure); -} - -void USardineCheckout::GetSaleDetails(UERC1155SaleContract* SaleContract, long TokenId, FSeqTokenMetaData TokenMetaData, - int64 ChainID, FString RecipientAddress, long Amount, FString PaymentToken, FString PaymentTokenSymbol, - long PaymentTokenDecimals, const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +void USardineCheckout::GetSaleDetails(const FContractCall& SaleDetailsCall, long& Amount, long TokenID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) { - long Cost = 20000; - long SupplyCap = 9999999999999; - long StartTimeLong = 1723058097; - long EndTimeLong = 2448832492; - - if (Amount > SupplyCap) - { - Amount = SupplyCap; - } - if (StartTimeLong > FDateTime::UtcNow().ToUnixTimestamp()) - { - OnFailure(FSequenceError(RequestFail, FString::Printf(TEXT("Token id %d is not yet available for sale"), (int) TokenId))); - } - if (EndTimeLong < FDateTime::UtcNow().ToUnixTimestamp()) + _wallet->Call(SaleDetailsCall, [this, Amount, TokenID, OnSuccess, OnFailure](FUnsizedData Data) { - OnFailure(FSequenceError(RequestFail, FString::Printf(TEXT("Token id %d is no longer available for sale"), (int) TokenId))); - } + FSaleDetails SaleDetails; + SaleDetails.Initialize(Data); - TArray TokenIds { (int32)TokenId }; - TArray Amounts { (int32)Amount }; - - FString CallData = SaleContract->MakePurchaseTransaction(RecipientAddress, TokenIds, Amounts, Proof).data; - - FSardinePaymentMethodTypeConfig PaymentConfig { - PaymentMethods, - PaymentMethod_Us_Debit - }; - - FSardineGetNFTCheckoutTokenArgs Args { - "", - 3600, - PaymentConfig, - TokenMetaData.name, - TokenMetaData.image, - USequenceSupport::GetNetworkNameForUrl(ChainID), - RecipientAddress, - SaleContract->ContractAddress, - "calldata_execution", - "smart_contract", - FString::FromInt(TokenId), - Amount, - (uint)TokenMetaData.decimals, - FString::FromInt(Cost), - PaymentToken, - PaymentTokenSymbol, - PaymentTokenDecimals, - CallData - }; + if (Amount > SaleDetails.SupplyCap) + { + SaleDetails.Amount = SaleDetails.SupplyCap; + } + else + { + SaleDetails.Amount = Amount; + } + if (SaleDetails.StartTimeLong > FDateTime::UtcNow().ToUnixTimestamp()) + { + OnFailure(FSequenceError(RequestFail, FString::Printf(TEXT("Token id %d is not yet available for sale"), (int) TokenID))); + } + if (SaleDetails.EndTimeLong < FDateTime::UtcNow().ToUnixTimestamp()) + { + OnFailure(FSequenceError(RequestFail, FString::Printf(TEXT("Token id %d is no longer available for sale"), (int) TokenID))); + } - SardineGetNFTCheckoutToken(Args, OnSuccess, OnFailure); + OnSuccess(SaleDetails); + }, OnFailure); } @@ -200,7 +146,8 @@ void USardineCheckout::HTTPPost(const FString& Endpoint, const FString& Args, *FString(UTF8_TO_TCHAR(HTTP_Post_Req->GetContent().GetData())).Replace(TEXT("\""), TEXT("\\\"")) ); - SEQ_LOG_EDITOR(Log, TEXT("%s"), *CurlCommand); + UE_LOG(LogTemp, Warning, TEXT("curl command: %s"), *CurlCommand); + // SEQ_LOG_EDITOR(Log, TEXT("%s"), *CurlCommand); HTTP_Post_Req->OnProcessRequestComplete().BindLambda([OnSuccess, OnFailure](const FHttpRequestPtr& Request, FHttpResponsePtr Response, const bool bWasSuccessful) @@ -355,9 +302,10 @@ void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleCon long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress, TArray data, TArray Proof) { - if (RecipientAddress.IsEmpty()) + FString RecipientAddressToUse = RecipientAddress; + if (RecipientAddressToUse.IsEmpty()) { - // set address to wallet address + RecipientAddressToUse = _wallet->GetWalletAddress(); } if(Amount < 1) @@ -365,10 +313,157 @@ void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleCon OnFailure(FSequenceError(InvalidArgument, "Amount must be greater than 0")); return; } - - GetPaymentToken(SaleContract, CollectionAddress, TokenID, ChainId, RecipientAddress, Amount, Proof, OnSuccess, OnFailure); + + // set provider url to appropriate node gateway url for given chain + _wallet->UpdateProviderURL(ChainId); + + FString PaymentToken = SaleContract->PaymentToken; + + GetPaymentDetails(PaymentToken, [this, PaymentToken, SaleContract, CollectionAddress, TokenID, ChainId, RecipientAddress, &Amount, Proof, OnSuccess, OnFailure](TTuple PaymentDetails) + { + FString PaymentTokenSymbol = PaymentDetails.Get<0>(); + long PaymentTokenDecimals = PaymentDetails.Get<1>(); + + UMarketplace* Marketplace = NewObject(); + Marketplace->GetCollectible(ChainId, CollectionAddress, FString::FromInt(TokenID), + [this, SaleContract, TokenID, ChainId, RecipientAddress, Amount, PaymentToken, PaymentTokenSymbol, PaymentTokenDecimals, Proof, OnSuccess, OnFailure](const FSeqTokenMetaData& TokenMetaData) + { + FContractCall SaleDetailsCall = SaleContract->GetTokenSaleDetails(TokenID); + TSuccessCallback OnGetSaleDetailsSuccess = [this, TokenID, Amount, SaleContract, RecipientAddress, Proof, TokenMetaData, ChainId, PaymentToken, PaymentTokenSymbol, PaymentTokenDecimals, OnSuccess, OnFailure](FSaleDetails SaleDetails) + { + TArray TokenIds { (int32)TokenID }; + TArray Amounts { (int32)Amount }; + + FString CallData = SaleContract->MakePurchaseTransaction(RecipientAddress, TokenIds, Amounts, Proof).data; + + FSardinePaymentMethodTypeConfig PaymentConfig { + PaymentMethods, + PaymentMethod_Us_Debit + }; + + FSardineGetNFTCheckoutTokenArgs Args { + "", + 3600, + PaymentConfig, + TokenMetaData.name, + TokenMetaData.image, + USequenceSupport::GetNetworkNameForUrl(ChainId), + RecipientAddress, + SaleContract->ContractAddress, + "calldata_execution", + "smart_contract", + FString::FromInt(TokenID), + SaleDetails.Amount, + (uint)TokenMetaData.decimals, + FString::FromInt(SaleDetails.Cost), + PaymentToken, + PaymentTokenSymbol, + PaymentTokenDecimals, + CallData + }; + + SardineGetNFTCheckoutToken(Args, OnSuccess, OnFailure); + }; + + FSaleDetails MockSaleDetails { + "", + 20000, + 9999999999, + 1723058097, + 2448832492, + Amount, + TArray() + }; + + OnGetSaleDetailsSuccess(MockSaleDetails); + // TODO: Use helper below instead + // GetSaleDetails(SaleDetailsCall, Amount, TokenID, OnGetSaleDetailsSuccess, OnFailure); + }, OnFailure); + }, OnFailure); +} + +void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainID, UERC721SaleContract* SaleContract, FString CollectionAddress, + long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, + FString RecipientAddress, TArray data, TArray Proof) +{ + if (RecipientAddress.IsEmpty()) + { + RecipientAddress = _wallet->GetWalletAddress(); + } + + if (Amount < 1) + { + OnFailure(FSequenceError(InvalidArgument, "Amount must be greater than 0")); + return; + } + + // set provider url to appropriate node gateway url for given chain + _wallet->UpdateProviderURL(ChainID); + + UMarketplace* Marketplace = NewObject(); + Marketplace->GetCollectible(ChainID, CollectionAddress, FString::FromInt(TokenID),[this, SaleContract, RecipientAddress, Amount, TokenID, Proof, ChainID, OnSuccess, OnFailure](const FSeqTokenMetaData& TokenMetaData) + { + FContractCall SaleDetailsCall = SaleContract->GetSaleDetails(); + TSuccessCallback OnGetSaleDetailsSuccess = [this, SaleContract, RecipientAddress, Amount, Proof, TokenMetaData, ChainID, TokenID, OnSuccess, OnFailure](FSaleDetails SaleDetails) + { + FString PaymentToken = SaleDetails.PaymentToken; + if (PaymentToken == FAddress::New().ToHex()) + { + OnFailure(FSequenceError(InvalidArgument, "Sardine checkout does not support native currency checkout; please choose an sales contract with a different payment token")); + } + + GetPaymentDetails(PaymentToken, [this, SaleContract, RecipientAddress, Amount, Proof, TokenMetaData, ChainID, TokenID, SaleDetails, PaymentToken, OnSuccess, OnFailure](TTuple PaymentDetails) + { + FString CallData = SaleContract->MakePurchaseTransaction(RecipientAddress, Amount, Proof).data; + + FSardinePaymentMethodTypeConfig PaymentConfig { + PaymentMethods, + PaymentMethod_Us_Debit + }; + + FSardineGetNFTCheckoutTokenArgs Args { + "", + 3600, + PaymentConfig, + TokenMetaData.name, + TokenMetaData.image, + USequenceSupport::GetNetworkNameForUrl(ChainID), + RecipientAddress, + SaleContract->ContractAddress, + "calldata_execution", + "smart_contract", + FString::FromInt(TokenID), + SaleDetails.Amount, + (uint)TokenMetaData.decimals, + FString::FromInt(SaleDetails.Cost), + PaymentToken, + PaymentDetails.Get<0>(), + PaymentDetails.Get<1>(), + CallData + }; + + SardineGetNFTCheckoutToken(Args, OnSuccess, OnFailure); + }, OnFailure); + }; + + FSaleDetails MockSaleDetails { + "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", + 0, + 10000, + 1723058097, + 2448832492, + Amount, + TArray() + }; + + OnGetSaleDetailsSuccess(MockSaleDetails); + + // TODO: Use helper below instead: + // GetSaleDetails(SaleDetailsCall, Amount, TokenID, , OnFailure); + }, OnFailure); } + void USardineCheckout::SardineGetSupportedRegions(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure) { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp index bfcf25c2d..6a8a2f71c 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.cpp @@ -1,5 +1,7 @@ // Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. #include "Provider.h" + +#include "ConfigFetcher.h" #include "Eth/Crypto.h" #include "Eth/EthTransaction.h" #include "Types/BinaryData.h" @@ -7,6 +9,7 @@ #include "Util/JsonBuilder.h" #include "RequestHandler.h" #include "Types/Header.h" +#include "Util/SequenceSupport.h" void UProvider::Init(const FString& UrlIn) { @@ -25,6 +28,11 @@ void UProvider::UpdateUrl(const FString& UrlIn) this->Url = UrlIn; } +void UProvider::UpdateUrl(int64 ChainID) +{ + this->Url = _baseURL + USequenceSupport::GetNetworkNameForUrl(ChainID) + "/" + UConfigFetcher::GetConfigVar(UConfigFetcher::ProjectAccessKey); +} + void UProvider::BlockByNumberHelper(const FString& Number, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure) { const FString Content = FJsonBuilder().ToPtr() diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h index b8f0c731a..82e7b8c76 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Provider.h @@ -22,6 +22,9 @@ class SEQUENCEPLUGIN_API UProvider : public URPCCaller { GENERATED_BODY() private: + const FString _prodURL = "https://nodes.sequence.app/"; + const FString _devURL = "https://dev-nodes.sequence.app/"; + const FString _baseURL = _prodURL; FString Url; //helpers @@ -34,6 +37,7 @@ class SEQUENCEPLUGIN_API UProvider : public URPCCaller public: static UProvider* Make(const FString& UrlIn); void UpdateUrl(const FString& UrlIn); + void UpdateUrl(int64 ChainID); void BlockByNumber(const uint64 Number, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); void BlockByNumber(const EBlockTag Tag, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); void BlockByHash(const FHash256& Hash, const TSuccessCallback>& OnSuccess, const FFailureCallback& OnFailure); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp index 7e9d72d11..6cea4fe77 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Sequence/SequenceAPI.cpp @@ -308,6 +308,15 @@ void USequenceWallet::UpdateProviderURL(const FString& Url) const } } +void USequenceWallet::UpdateProviderURL(int64 ChainID) const +{ + if (this->Provider) + { + this->Provider->UpdateUrl(ChainID); + } +} + + void USequenceWallet::SignMessage(const FString& Message, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const { if (this->SequenceRPCManager) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp index dedaf20f3..aa867a80d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp @@ -98,7 +98,7 @@ FContractCall UERC1155SaleContract::GetPaymentToken() FContractCall CallData; CallData.Data = TOptional(EncodedData.ToHex()); - CallData.To = FAddress::From(ContractAddress); + CallData.To = FAddress::From(ContractAddress.Mid(2, ContractAddress.Len())); return CallData; } @@ -111,7 +111,7 @@ FContractCall UERC1155SaleContract::GetGlobalSaleDetails() FContractCall CallData; CallData.Data = TOptional(EncodedData.ToHex()); - CallData.To = FAddress::From(ContractAddress); + CallData.To = FAddress::From(ContractAddress.Mid(2, ContractAddress.Len())); return CallData; } @@ -127,7 +127,7 @@ FContractCall UERC1155SaleContract::GetTokenSaleDetails(long TokenID) FContractCall CallData; CallData.Data = TOptional(EncodedData.ToHex()); - CallData.To = FAddress::From(ContractAddress); + CallData.To = FAddress::From(ContractAddress.Mid(2, ContractAddress.Len())); return CallData; } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp index 5c221ad96..805e3d9a5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC20.cpp @@ -1,5 +1,6 @@ #include "Types/ERC20.h" #include "ABI/ABI.h" +#include "Util/Log.h" UERC20::UERC20() { @@ -125,12 +126,18 @@ FRawTransaction UERC20::MakeBurnTransaction(const int32 Amount) FContractCall UERC20::MakeSymbolTransaction() { FString FunctionSignature = "symbol()"; - TArray Arr; - FUnsizedData EncodedData = ABI::Encode(FunctionSignature, Arr); - + TArray> Arr; + TOptional EncodedData = ABI::Encode(FunctionSignature, Arr); FContractCall T; - T.To = FAddress::From(ContractAddress); - T.Data = TOptional(EncodedData.ToHex()); + + if (!EncodedData.IsSet()) + { + SEQ_LOG(Display, TEXT("Encoded data is invalid")); + return T; + } + + T.To = FAddress::From(ContractAddress.Mid(2, ContractAddress.Len())); + T.Data = TOptional(EncodedData.GetValue().ToHex()); return T; } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC721SaleContract.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC721SaleContract.cpp index 181667ac0..9d2a985ed 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC721SaleContract.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC721SaleContract.cpp @@ -65,6 +65,13 @@ FRawTransaction UERC721SaleContract::MakePurchaseTransaction(const FString& ToAd return T; } +void UERC721SaleContract::Initialize(FString _ContractAddress, FString _PaymentToken, int32 _MaxTotal, FString _Data) +{ + ContractAddress = _ContractAddress; + PaymentToken = _PaymentToken; + MaxTotal = _MaxTotal; + Data = _Data; +} FContractCall UERC721SaleContract::GetSaleDetails() { @@ -74,7 +81,7 @@ FContractCall UERC721SaleContract::GetSaleDetails() FContractCall CallData; CallData.Data = TOptional(EncodedData.ToHex()); - CallData.To = FAddress::From(ContractAddress); + CallData.To = FAddress::From(ContractAddress.Mid(2, ContractAddress.Len())); return CallData; } \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/SaleDetails.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/SaleDetails.cpp new file mode 100644 index 000000000..8459d2b30 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/SaleDetails.cpp @@ -0,0 +1,11 @@ +#include "Types/SaleDetails.h" + +void FSaleDetails::Initialize(FUnsizedData Data) +{ + // unpack unsized data into usable fields + Cost = 20000; + SupplyCap = 9999999999999; + StartTimeLong = 1723058097; + EndTimeLong = 2448832492; +} + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h index 97200b5cd..1a8eb0827 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h @@ -97,8 +97,6 @@ struct SEQUENCEPLUGIN_API FSeqTokenMetaData */ void Setup(FJsonObject json_in) {//the json object we expect here will be a mirror of what is above EXCEPT we will be snipping out what we need! - - UE_LOG(LogTemp, Warning, TEXT("seq token meta data setup start")); FString tokenIdString; if (json_in.TryGetStringField(TEXT("tokenId"), tokenIdString)) @@ -146,8 +144,5 @@ struct SEQUENCEPLUGIN_API FSeqTokenMetaData } } } - - - UE_LOG(LogTemp, Warning, TEXT("seq token meta data setup done")); } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index d3522de09..371824df7 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -20,6 +20,7 @@ #include "Structs/SardineToken.h" #include "Types/ERC1155SaleContract.h" #include "Types/ERC721SaleContract.h" +#include "Types/SaleDetails.h" #include "UObject/Object.h" #include "Util/Async.h" #include "SardineCheckout.generated.h" @@ -49,26 +50,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject FString Url(const FString& EndPoint) const; - void GetPaymentToken(UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, int64 ChainID, - FString RecipientAddress, long Amount, const TArray& Proof, TSuccessCallback OnSuccess, - const FFailureCallback& OnFailure); - void GetPaymentDetails(FString PaymentToken, TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); - void GetPaymentDetails(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, - long TokenID, int64 ChainID, FString RecipientAddress, long Amount, const TArray& Proof, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - - void GetCollectible(int64 ChainID, FString CollectionAddress, long TokenID, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - - void GetCollectible(FString PaymentToken, UERC1155SaleContract* SaleContract, FString CollectionAddress, - long TokenID, int64 ChainID, FString RecipientAddress, long Amount, FString PaymentTokenSymbol, long PaymentTokenDecimals, - const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); - - void GetSaleDetails(UERC1155SaleContract* SaleContract, long TokenId, FSeqTokenMetaData TokenMetaData, int64 ChainID, - FString RecipientAddress, long Amount, FString PaymentToken, FString PaymentTokenSymbol, long PaymentTokenDecimals, - const TArray& Proof, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void GetSaleDetails(const FContractCall& SaleDetailsCall, long& Amount, long TokenID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void SardineGetNFTCheckoutToken(const FSardineGetNFTCheckoutTokenArgs& Args, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); @@ -115,7 +99,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(), TArray Proof = TArray()); - void SardineGetNFTCheckoutToken(UERC721SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); + void SardineGetNFTCheckoutToken(int64 ChainID, UERC721SaleContract* SaleContract, FString CollectionAddress, long TokenID, + long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, + FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h index 8988c98ef..009948de2 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Sequence/SequenceAPI.h @@ -138,6 +138,12 @@ class SEQUENCEPLUGIN_API USequenceWallet : public UGameInstanceSubsystem */ void UpdateProviderURL(const FString& Url) const; + /** + * Allows you to update the provider URL to a node gateway url given the chainID + * @param ChainID ID for chain you want the node gateway to be associated with + */ + void UpdateProviderURL(int64 ChainID) const; + /** * Allows you to update the set network for the SequenceWallet * @param NewNetwork New network you wish to use diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC721SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC721SaleContract.h index 2a85a1dc2..3f8c77e2b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC721SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC721SaleContract.h @@ -32,6 +32,8 @@ class SEQUENCEPLUGIN_API UERC721SaleContract : public UObject UFUNCTION(BlueprintCallable, Category = "ERC721 Sale") FRawTransaction MakePurchaseTransaction(const FString& ToAddress, const int32& Amount, const TArray& Proof); + void Initialize(FString _ContractAddress, FString _PaymentToken, int32 _MaxTotal, FString _Data); + FContractCall GetSaleDetails(); }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/SaleDetails.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/SaleDetails.h new file mode 100644 index 000000000..5fec1d20c --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/SaleDetails.h @@ -0,0 +1,21 @@ +#pragma once + +#include "BinaryData.h" +#include "SaleDetails.generated.h" + +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FSaleDetails +{ + GENERATED_USTRUCT_BODY() + +public: + FString PaymentToken; + long Cost; + long SupplyCap; + long StartTimeLong; + long EndTimeLong; + long Amount; + TArray MerkleRoot; + + void Initialize(FUnsizedData Data); +}; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.cpp similarity index 71% rename from Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp rename to Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.cpp index 8d62fb623..c60588011 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.cpp @@ -1,4 +1,4 @@ -#include "SardineGetNFTCheckoutTokenTest.h" +#include "SardineERC1155CheckoutTokenTest.h" #include "CoreMinimal.h" #include "Misc/AutomationTest.h" #include "Engine/World.h" @@ -7,17 +7,17 @@ #include "Tests/AutomationEditorCommon.h" #include "Util/Async.h" -IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineGetNFTCheckoutTokenTest, "SequencePlugin.EndToEnd.SardineTests.GetNFTCheckoutTokenTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineERC1155CheckoutTokenTest, "SequencePlugin.EndToEnd.SardineTests.ERC1155CheckoutTokenTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) -void FSardineGetNFTCheckoutTokenTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +void FSardineERC1155CheckoutTokenTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const { - OutBeautifiedNames.Add(TEXT("Sardine Get NFT Checkout Token Test")); + OutBeautifiedNames.Add(TEXT("Sardine ERC1155 Checkout Token Test")); OutTestCommands.Add(TEXT("")); } -bool FSardineGetNFTCheckoutTokenTest::RunTest(const FString& Parameters) +bool FSardineERC1155CheckoutTokenTest::RunTest(const FString& Parameters) { - AddInfo(TEXT("Starting Sardine Get NFT CHeckout Token Test")); + AddInfo(TEXT("Starting Sardine ERC1155 Checkout Token Test")); // Start PIE ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); @@ -28,17 +28,17 @@ bool FSardineGetNFTCheckoutTokenTest::RunTest(const FString& Parameters) // Run the actual test ADD_LATENT_AUTOMATION_COMMAND(FFunctionLatentCommand([this]() { - USardineGetNFTCheckoutTokenTestHelper* TestHelper = NewObject(); + USardineERC1155CheckoutTokenTestHelper* TestHelper = NewObject(); TestHelper->ParentTest = this; TestHelper->RunTest(); - ADD_LATENT_AUTOMATION_COMMAND(FWaitForGetNFTCheckoutToken(TestHelper)); + ADD_LATENT_AUTOMATION_COMMAND(FWaitForERC1155CheckoutToken(TestHelper)); return true; })); return true; } -void USardineGetNFTCheckoutTokenTestHelper::RunTest() +void USardineERC1155CheckoutTokenTestHelper::RunTest() { Checkout = NewObject(); @@ -74,7 +74,7 @@ void USardineGetNFTCheckoutTokenTestHelper::RunTest() GetNFTCheckoutTokenSuccess, GetNFTCheckoutTokenFailure, RecipientAddress, Data, Proof); } -bool FWaitForGetNFTCheckoutToken::Update() +bool FWaitForERC1155CheckoutToken::Update() { return TestHelper->IsTestComplete(); } diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.h new file mode 100644 index 000000000..ded30c2cb --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC1155CheckoutTokenTest.h @@ -0,0 +1,24 @@ +#pragma once +#include "Marketplace/Sardine/SardineCheckout.h" + +#include "SardineERC1155CheckoutTokenTest.generated.h" + +class FSardineERC1155CheckoutTokenTest; + +UCLASS() +class USardineERC1155CheckoutTokenTestHelper : public UObject +{ + GENERATED_BODY() + +public: + void RunTest(); + bool IsTestComplete() const { return bTestComplete; } + + FSardineERC1155CheckoutTokenTest* ParentTest; + +private: + bool bTestComplete = false; + USardineCheckout* Checkout = nullptr; +}; + +DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForERC1155CheckoutToken, USardineERC1155CheckoutTokenTestHelper*, TestHelper); diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.cpp new file mode 100644 index 000000000..9d97e1241 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.cpp @@ -0,0 +1,80 @@ +#include "SardineERC721CheckoutTokenTest.h" +#include "CoreMinimal.h" +#include "Misc/AutomationTest.h" +#include "Engine/World.h" +#include "Marketplace/Sardine/SardineCheckout.h" +#include "Tests/AutomationCommon.h" +#include "Tests/AutomationEditorCommon.h" +#include "Util/Async.h" + +IMPLEMENT_COMPLEX_AUTOMATION_TEST(FSardineERC721CheckoutTokenTest, "SequencePlugin.EndToEnd.SardineTests.ERC721CheckoutTokenTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +void FSardineERC721CheckoutTokenTest::GetTests(TArray& OutBeautifiedNames, TArray& OutTestCommands) const +{ + OutBeautifiedNames.Add(TEXT("Sardine ERC721 Checkout Token Test")); + OutTestCommands.Add(TEXT("")); +} + +bool FSardineERC721CheckoutTokenTest::RunTest(const FString& Parameters) +{ + AddInfo(TEXT("Starting Sardine ERC721 Checkout Token Test")); + + // Start PIE + ADD_LATENT_AUTOMATION_COMMAND(FStartPIECommand(true)); + + // Wait for PIE to initialize + ADD_LATENT_AUTOMATION_COMMAND(FEngineWaitLatentCommand(1.0f)); + + // Run the actual test + ADD_LATENT_AUTOMATION_COMMAND(FFunctionLatentCommand([this]() + { + USardineERC721CheckoutTokenTestHelper* TestHelper = NewObject(); + TestHelper->ParentTest = this; + TestHelper->RunTest(); + + ADD_LATENT_AUTOMATION_COMMAND(FWaitForERC721CheckoutToken(TestHelper)); + return true; + })); + return true; +} + +void USardineERC721CheckoutTokenTestHelper::RunTest() +{ + Checkout = NewObject(); + + // mock data + int64 ChainID = 137; + UERC721SaleContract* SaleContract = NewObject(); + SaleContract->Initialize("0xa3834cf6a4a620469fca67c7c7be4b840e2d27c0", "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", 99999, ""); + + FString CollectionAddress = "0x36feb83e1f52180aca9ada43ec1797aa7406a2bd"; + long TokenID = 1; + long Amount = 1; + FString RecipientAddress = "0x9886910Faec24328FE8104a300e5D08FF0B5675b"; + TArray Proof; + TArray Data; + Proof.Empty(); + Data.Empty(); + + const TSuccessCallback GetNFTCheckoutTokenSuccess = [this](const FSardineNFTCheckout& Token) + { + bTestComplete = true; + const FString Message = "Sardine NFT Checkout Token request succeeded with token"; + ParentTest->AddInfo(FString::Printf(TEXT("%s: %s"), *Message, *Token.Token)); + }; + + const FFailureCallback GetNFTCheckoutTokenFailure = [this](const FSequenceError& Error) + { + bTestComplete = true; + const FString Message = "Request Failure"; + ParentTest->AddError(FString::Printf(TEXT("%s: %s."), *Message, *Error.Message)); + }; + + Checkout->SardineGetNFTCheckoutToken(ChainID, SaleContract, CollectionAddress, TokenID, Amount, + GetNFTCheckoutTokenSuccess, GetNFTCheckoutTokenFailure, RecipientAddress, Data, Proof); +} + +bool FWaitForERC721CheckoutToken::Update() +{ + return TestHelper->IsTestComplete(); +} diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.h new file mode 100644 index 000000000..bd1144a18 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineERC721CheckoutTokenTest.h @@ -0,0 +1,24 @@ +#pragma once +#include "Marketplace/Sardine/SardineCheckout.h" + +#include "SardineERC721CheckoutTokenTest.generated.h" + +class FSardineERC721CheckoutTokenTest; + +UCLASS() +class USardineERC721CheckoutTokenTestHelper : public UObject +{ + GENERATED_BODY() + +public: + void RunTest(); + bool IsTestComplete() const { return bTestComplete; } + + FSardineERC721CheckoutTokenTest* ParentTest; + +private: + bool bTestComplete = false; + USardineCheckout* Checkout = nullptr; +}; + +DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForERC721CheckoutToken, USardineERC721CheckoutTokenTestHelper*, TestHelper); diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h b/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h deleted file mode 100644 index d8f56f779..000000000 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/SardineTests/SardineGetNFTCheckoutTokenTest.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "Marketplace/Sardine/SardineCheckout.h" - -#include "SardineGetNFTCheckoutTokenTest.generated.h" - -class FSardineGetNFTCheckoutTokenTest; - -UCLASS() -class USardineGetNFTCheckoutTokenTestHelper : public UObject -{ - GENERATED_BODY() - -public: - void RunTest(); - bool IsTestComplete() const { return bTestComplete; } - - FSardineGetNFTCheckoutTokenTest* ParentTest; - -private: - bool bTestComplete = false; - USardineCheckout* Checkout = nullptr; -}; - -DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitForGetNFTCheckoutToken, USardineGetNFTCheckoutTokenTestHelper*, TestHelper); From 9fdd07639058c0f342c283d89326ea3e7d01a135 Mon Sep 17 00:00:00 2001 From: Jan Dohring Date: Fri, 4 Apr 2025 15:21:39 -0400 Subject: [PATCH 45/48] Checkout implemenation --- .../Private/Checkout/SequenceCheckout.cpp | 104 ++++++++++++++++-- .../Marketplace/Sardine/SardineCheckout.cpp | 67 ++++++++++- .../Private/Util/SequenceSupport.cpp | 16 +++ .../Public/Checkout/SequenceCheckout.h | 11 +- .../Marketplace/Sardine/SardineCheckout.h | 4 +- .../Structs/SardineGetNFTCheckoutTokenArgs.h | 4 +- .../Public/Util/SequenceSupport.h | 53 +++++++++ 7 files changed, 241 insertions(+), 18 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp index ebee65e27..de0eee6d5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp @@ -93,6 +93,55 @@ void USequenceCheckout::HTTPPost(const int64& TargetChainID, const FString& Endp HTTP_Post_Req->ProcessRequest(); } +TArray USequenceCheckout::AssembleOrderData(TArray Orders, int64 amount) +{ + int64 AmountLeft = amount; + TArray OrderDatas; + const int Length = Orders.Num(); + for (int i = 0; i < Length; i++) + { + const int64 Available = FCString::Atoi(*Orders[i].QuantityAvailable); + if(AmountLeft <= Available) + { + OrderDatas.Add(FOrderData { + Orders[i].OrderId, + FString::Printf(TEXT("%lld"), AmountLeft) + }); + break; + } + + OrderDatas.Add(FOrderData { + Orders[i].OrderId, + FString::Printf(TEXT("%lld"), Available) + }); + + AmountLeft -= Available; + if(AmountLeft == 0) + { + break; + } + } + + return OrderDatas; +} + +void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const TArray OrderDatas, + FString CollectionContractAddress, EMarketplaceKind MarketplaceKind, const FAdditionalFee& AdditionalFee, + const EWalletKind WalletKind, TSuccessCallback OnSuccess, + FFailureCallback OnFailure) const +{ + const TArray AdditionalFees { AdditionalFee }; + + const FString Endpoint = "GenerateBuyTransaction"; + const FString Args = BuildArgs(FGenerateBuyTransaction{ CollectionContractAddress, WalletAddress, MarketplaceKind, OrderDatas, AdditionalFees, WalletKind }); + + HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) + { + const FGenerateTransactionResponse Response = BuildResponse(Content); + OnSuccess(Response); + }, OnFailure); +} + USequenceCheckout::USequenceCheckout() { this->ChainID = 0; @@ -192,34 +241,69 @@ void USequenceCheckout::GetCheckoutOptionsByOrders(const FString& WalletAddress, void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const +{ + GenerateBuyTransaction(WalletAddress, Order, Amount, AdditionalFee, WalletKind, [OnSuccess](FGenerateTransactionResponse Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, + const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, + TSuccessCallback OnSuccess, FFailureCallback OnFailure) const { TArray OrdersData; OrdersData.Reserve(1); OrdersData.Add(FOrderData(Order.OrderId, FString::Printf(TEXT("%lld"), Amount))); - const TArray AdditionalFees { AdditionalFee }; + GenerateBuyTransaction(WalletAddress, OrdersData, Order.CollectionContractAddress, Order.Marketplace, AdditionalFee, WalletKind, OnSuccess, OnFailure); +} - const FString Endpoint = "GenerateBuyTransaction"; - const FString Args = BuildArgs(FGenerateBuyTransaction{ Order.CollectionContractAddress, WalletAddress, Order.Marketplace, OrdersData, AdditionalFees, WalletKind }); - - HTTPPost(ChainID, Endpoint, Args, [this, OnSuccess](const FString& Content) +void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, + const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, + FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const +{ + GenerateBuyTransaction(WalletAddress, Orders, Amount, AdditionalFee, WalletKind, [OnSuccess](FGenerateTransactionResponse Response) { - const FGenerateTransactionResponse Response = BuildResponse(Content); - if (OnSuccess.IsBound()) + if(OnSuccess.IsBound()) { OnSuccess.Execute(Response); } - }, [this, OnFailure](const FSequenceError& Error) + }, [OnFailure](FSequenceError Error) { - if (OnFailure.IsBound()) + if(OnFailure.IsBound()) { OnFailure.Execute(); } }); } +void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, + const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, + TSuccessCallback OnSuccess, FFailureCallback OnFailure) const +{ + TArray SortedOrders = Orders; + SortedOrders.Sort([](const FSeqOrder& A, const FSeqOrder& B) + { + return A.PriceUSD < B.PriceUSD; + }); + + TArray OrderDatas = AssembleOrderData(SortedOrders, Amount); + GenerateBuyTransaction(WalletAddress, OrderDatas, SortedOrders[0].CollectionContractAddress, SortedOrders[0].Marketplace, AdditionalFee, WalletKind, OnSuccess, OnFailure); + +} + void USequenceCheckout::GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, - FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const + FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { TArray OrdersData; OrdersData.Reserve(1); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 397847b4a..bfe2b33d0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -5,6 +5,8 @@ #include "ConfigFetcher.h" #include "HttpModule.h" +#include "Checkout/SequenceCheckout.h" +#include "Checkout/Structs/TransactionStep.h" #include "Interfaces/IHttpResponse.h" #include "Marketplace/Marketplace.h" #include "Marketplace/Sardine/Structs/SardineEnabledTokensResponse.h" @@ -274,13 +276,13 @@ void USardineCheckout::OnRamp(const FString& ClientToken) } } -void USardineCheckout::SardineGetNFTCheckoutToken(TArray Orders, long Quantity, +void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, const FString& WalletAddress, TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) { if (RecipientAddress.IsEmpty()) { - // set to wallet address + RecipientAddress = WalletAddress; } if(Orders.Num() < 1) @@ -289,13 +291,59 @@ void USardineCheckout::SardineGetNFTCheckoutToken(TArray O return; } - if(Orders[0].Order.PriceCurrencyAddress == FAddress::New().ToHex()) + FSeqCollectibleOrder Order = Orders[0]; + + if(Order.Order.PriceCurrencyAddress == FAddress::New().ToHex()) { OnFailure(FSequenceError(InvalidArgument, "Sardine doesn't support native currency checkout; please choose a different payment token")); return; } - //TODO Generate steps from checkout + FString PriceSymbol = USequenceSupport::GetNetworkSymbol(ChainId); + + const USequenceCheckout* Checkout = NewObject(); + + TArray BuyOrders; + for(FSeqCollectibleOrder CollectibleOrder : Orders) + BuyOrders.Push(CollectibleOrder.Order); + + Checkout->GenerateBuyTransaction(WalletAddress, BuyOrders, Quantity, AdditionalFee[0], EWalletKind::Unknown, + ([this, OnSuccess, ChainId, RecipientAddress, MarketPlaceContractAddress, Quantity, PriceSymbol, Order, OnFailure](const FGenerateTransactionResponse& Response) + { + const FTransactionStep Step = FTransactionStep::ExtractBuyStep(Response.Steps); + + const FSardineGetNFTCheckoutTokenArgs Args { + "", + 3600, + FSardinePaymentMethodTypeConfig { + PaymentMethods, + PaymentMethod_Us_Debit + }, + Order.TokenMetadata.name, + Order.TokenMetadata.image, + USequenceSupport::GetNetworkNameForUrl(ChainId), + RecipientAddress, + MarketPlaceContractAddress, + "calldata_execution", + "smart_contract", + Order.Order.TokenId, + Quantity, + Order.Order.QuantityDecimals, + Order.Order.PriceAmount, + Order.Order.PriceCurrencyAddress, + PriceSymbol, + Order.Order.PriceDecimals, + Step.Data, + }; + + FString Endpoint = "SardineGetNFTCheckoutToken"; + HTTPPost(Endpoint, BuildArgs(Args), [this, OnSuccess](const FString& Content) + { + const FSardineGetNFTCheckoutTokenResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Checkout); + }, OnFailure); + + }), OnFailure); } void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, @@ -518,4 +566,15 @@ FString USardineCheckout::CheckoutURL(FSardineNFTCheckout Token) return CheckoutURL(Token.Token); } +void USardineCheckout::Checkout(FSardineNFTCheckout Token) +{ + FString URL = CheckoutURL(Token); + FString * ErrorPtr = nullptr; + FPlatformProcess::LaunchURL(*URL,TEXT(""),ErrorPtr); + if (ErrorPtr) + { + UE_LOG(LogTemp,Error,TEXT("Browser LaunchError: %s"), **ErrorPtr); + } +} + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp index 928619c81..047d96c8a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Util/SequenceSupport.cpp @@ -29,6 +29,17 @@ FString USequenceSupport::GetNetworkName(const ENetwork NetworkIn) return TEXT(""); } +ENetwork USequenceSupport::GetNetworkFromId(const int64 NetworkIdIn) +{ + if (NetworkIdToEnumMap.Contains(NetworkIdIn)) + { + return *NetworkIdToEnumMap.Find(NetworkIdIn); + } + + UE_LOG(LogTemp, Warning, TEXT("Network not found for Id: %lld"), NetworkIdIn); + return Ethereum; +} + FString USequenceSupport::GetNetworkNameForUrl(const int64 NetworkIdIn) { if (NetworkIdToUrlMap.Contains(NetworkIdIn)) @@ -49,6 +60,11 @@ FString USequenceSupport::GetNetworkSymbol(const ENetwork NetworkIn) return TEXT(""); } +FString USequenceSupport::GetNetworkSymbol(const int64 NetworkIn) +{ + return GetNetworkSymbol(GetNetworkFromId(NetworkIn)); +} + bool USequenceSupport::IsNetworkIdSupported(const int64 NetworkIdIn) { return NetworkIdToNameMap.Contains(NetworkIdIn); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h index 1ba465e7b..5aa65ff8b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h @@ -7,6 +7,7 @@ #include "Marketplace/Marketplace.h" #include "Sequence/SequenceAPI.h" #include "Sequence/Wallet_Enums.h" +#include "Structs/OrderData.h" #include "SequenceCheckout.generated.h" @@ -30,7 +31,11 @@ class SEQUENCEPLUGIN_API USequenceCheckout : public UObject FString Url(const int64& TargetChainID,const FString& EndPoint) const; static FString HostName(int64 TargetChainID); void HTTPPost(const int64& TargetChainID,const FString& Endpoint,const FString& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const; - + static TArray AssembleOrderData(TArray Orders, int64 amount); + void GenerateBuyTransaction(const FString& WalletAddress, const TArray OrderDatas, FString CollectionContractAddress, EMarketplaceKind + MarketplaceKind, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, TSuccessCallback + OnSuccess, FFailureCallback OnFailure) const; + public: // Constructor USequenceCheckout(); @@ -49,6 +54,10 @@ class SEQUENCEPLUGIN_API USequenceCheckout : public UObject void GetCheckoutOptionsByOrders(const FString& WalletAddress, const TArray& Orders, const int64 AdditionalFeeBps, FOnGetCheckoutOptionsResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure)const; UFUNCTION(BlueprintCallable, Category = "Checkout") void GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, TSuccessCallback OnSuccess, FFailureCallback OnFailure) const; + UFUNCTION(BlueprintCallable, Category = "Checkout") + void GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, TSuccessCallback OnSuccess, FFailureCallback OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") void GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index 371824df7..e4759855b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -93,7 +93,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); - void SardineGetNFTCheckoutToken(TArray Orders, long Quantity, FString RecipientAddress, TArray AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutToken(int64 ChainId, const FString& WalletAddress, TArray Orders, long Quantity, FString RecipientAddress, TArray + AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const + FFailureCallback& OnFailure); void SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h index cf3e9286c..a9b71354e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/Structs/SardineGetNFTCheckoutTokenArgs.h @@ -43,8 +43,8 @@ struct SEQUENCEPLUGIN_API FSardineGetNFTCheckoutTokenArgs { FJsonBuilder Builder; - Builder.AddString(TEXT("name"), Name); - Builder.AddString(TEXT("imageUrl"), ImageUrl); + Builder.AddString(TEXT("name"), Name == "" ? "Placeholder" : Name); + Builder.AddString(TEXT("imageUrl"), ImageUrl == "" ? "https://dev-metadata.sequence.app/projects/1010/collections/394/tokens/1/image.webp" : ImageUrl); Builder.AddString(TEXT("network"), Network); Builder.AddString(TEXT("recipientAddress"), RecipientAddress); Builder.AddString(TEXT("blockchainNftId"), BlockchainNftId); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h index e6dc18c12..27701889b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Util/SequenceSupport.h @@ -197,6 +197,56 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject FNameId(TEXT("moonbase-alpha"),1287), FNameId(TEXT("etherlink-testnet"),128123), }; + + static inline TMap NetworkIdToEnumMap = { + {1, ENetwork::Ethereum}, + {13371, ENetwork::Immutable}, + {1482601649, ENetwork::SkaleNebula}, + {10, ENetwork::Optimism}, + {56, ENetwork::BNBSmartChain}, + {100, ENetwork::GnosisChain}, + {137, ENetwork::PolygonChain}, + {1101, ENetwork::PolygonZkEVM}, + {8333, ENetwork::B3}, + {8453, ENetwork::Base}, + {19011, ENetwork::OasysHomeverse}, + {33139, ENetwork::APEChain}, + {42161, ENetwork::ArbitrumOne}, + {42170, ENetwork::ArbitrumNova}, + {43114, ENetwork::Avalanche}, + {81457, ENetwork::Blast}, + {660279, ENetwork::Xai}, + {6283, ENetwork::LAOS}, + {7668, ENetwork::Root}, + {1868, ENetwork::Soneium}, + {40, ENetwork::Telos}, + {1284, ENetwork::Moonbeam}, + {42793, ENetwork::Etherlink}, + {273, ENetwork::XR1}, + + {13473, ENetwork::ImmutableTestnet}, + {97, ENetwork::BNBSmartChainTestnet}, + {1946, ENetwork::SoneiumMinatoTestnet}, + {1993, ENetwork::B3Sepolia}, + {2730, ENetwork::XRSepolia}, + {33111, ENetwork::APEChainTestnet}, + {40875, ENetwork::OasysHomeverseTestnet}, + {43113, ENetwork::AvalancheTestnet}, + {80002, ENetwork::PolygonAmoy}, + {84532, ENetwork::BaseSepolia}, + {421614, ENetwork::ArbitrumSepolia}, + {11155111, ENetwork::Sepolia}, + {11155420, ENetwork::OptimismSepolia}, + {21000000, ENetwork::TOYTestnet}, + {37084624, ENetwork::SKALENebulaGamingHubTestnet}, + {168587773, ENetwork::BlastSepolia}, + {37714555429, ENetwork::XaiSepolia}, + {62850, ENetwork::LAOSSigma}, + {7672, ENetwork::RootPorcini}, + {41, ENetwork::TelosTestnet}, + {1287, ENetwork::MoonbaseAlpha}, + {128123, ENetwork::EtherlinkTestnet}, + }; static inline TMap NetworkEnumToIdMap = { {ENetwork::Ethereum, 1}, @@ -359,11 +409,14 @@ class SEQUENCEPLUGIN_API USequenceSupport : public UObject static FString GetNetworkName(const ENetwork NetworkIn); + static ENetwork GetNetworkFromId(const int64 NetworkIdIn); static FString GetNetworkNameForUrl(const int64 NetworkIdIn); static FString GetNetworkSymbol(const ENetwork NetworkIn); + static FString GetNetworkSymbol(const int64 NetworkIn); + static bool IsNetworkIdSupported(const int64 NetworkIdIn); /** From 8fc0cb1c80125572d721e9d1003213b4f7aa4124 Mon Sep 17 00:00:00 2001 From: Jan Dohring Date: Mon, 7 Apr 2025 12:08:26 -0400 Subject: [PATCH 46/48] checkout nearly finished --- .../Private/Checkout/SequenceCheckout.cpp | 2 +- .../Marketplace/Sardine/SardineCheckout.cpp | 86 ++++++++++++------- .../Public/Checkout/SequenceCheckout.h | 2 +- .../Marketplace/Sardine/SardineCheckout.h | 3 + 4 files changed, 62 insertions(+), 31 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp index de0eee6d5..d3cd2f0ae 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/SequenceCheckout.cpp @@ -268,7 +268,7 @@ void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, con GenerateBuyTransaction(WalletAddress, OrdersData, Order.CollectionContractAddress, Order.Marketplace, AdditionalFee, WalletKind, OnSuccess, OnFailure); } -void USequenceCheckout::GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, +void USequenceCheckout::GenerateBuyTransactionMultipleOrders(const FString& WalletAddress, const TArray Orders, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index bfe2b33d0..1618ba24f 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -116,6 +116,42 @@ void USardineCheckout::SardineGetNFTCheckoutToken(const FSardineGetNFTCheckoutTo }, OnFailure); } +void USardineCheckout::SardineGetNFTCheckoutTokenSendRequest(int64 ChainId, FSeqCollectibleOrder Order, + FString RecipientAddress, FString MarketplaceContractAddress, long Quantity, FString PriceSymbol, FString CallData, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure) +{ + const FSardineGetNFTCheckoutTokenArgs Args { + "", + 3600, + FSardinePaymentMethodTypeConfig { + PaymentMethods, + PaymentMethod_Us_Debit + }, + Order.TokenMetadata.name, + Order.TokenMetadata.image, + USequenceSupport::GetNetworkNameForUrl(ChainId), + RecipientAddress, + MarketplaceContractAddress, + "calldata_execution", + "smart_contract", + Order.Order.TokenId, + Quantity, + Order.Order.QuantityDecimals, + Order.Order.PriceAmount, + Order.Order.PriceCurrencyAddress, + PriceSymbol, + Order.Order.PriceDecimals, + CallData, + }; + + FString Endpoint = "SardineGetNFTCheckoutToken"; + HTTPPost(Endpoint, BuildArgs(Args), [this, OnSuccess](const FString& Content) + { + const FSardineGetNFTCheckoutTokenResponse Response = this->BuildResponse(Content); + OnSuccess(Response.Checkout); + }, OnFailure); +} + void USardineCheckout::HTTPPost(const FString& Endpoint, const FString& Args, const TSuccessCallback& OnSuccess, const FFailureCallback& OnFailure) const { @@ -312,40 +348,32 @@ void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, const FString& { const FTransactionStep Step = FTransactionStep::ExtractBuyStep(Response.Steps); - const FSardineGetNFTCheckoutTokenArgs Args { - "", - 3600, - FSardinePaymentMethodTypeConfig { - PaymentMethods, - PaymentMethod_Us_Debit - }, - Order.TokenMetadata.name, - Order.TokenMetadata.image, - USequenceSupport::GetNetworkNameForUrl(ChainId), - RecipientAddress, - MarketPlaceContractAddress, - "calldata_execution", - "smart_contract", - Order.Order.TokenId, - Quantity, - Order.Order.QuantityDecimals, - Order.Order.PriceAmount, - Order.Order.PriceCurrencyAddress, - PriceSymbol, - Order.Order.PriceDecimals, - Step.Data, - }; + if(Order.Order.PriceCurrencyAddress != FAddress::New().ToHex()) + { + // TODO: The following call will not work currently, so we will use USDC temporarily + // UERC20* PaymentTokenContract = NewObject(); + // PaymentTokenContract->Initialize(Order.Order.PriceCurrencyAddress); + // FContractCall SymbolCall = PaymentTokenContract->MakeSymbolTransaction(); + // _wallet->Call(SymbolCall, [this, OnSuccess, OnFailure, ChainId, Order, RecipientAddress, MarketPlaceContractAddress, Quantity, Step](FUnsizedData Data) + // { + // FString PaymentTokenSymbol = UTF8ToString(Data); + // SardineGetNFTCheckoutTokenSendRequest(ChainId, Order, RecipientAddress, MarketPlaceContractAddress, Quantity, PaymentTokenSymbol, Step.Data, + // OnSuccess, OnFailure); + // }, OnFailure); - FString Endpoint = "SardineGetNFTCheckoutToken"; - HTTPPost(Endpoint, BuildArgs(Args), [this, OnSuccess](const FString& Content) - { - const FSardineGetNFTCheckoutTokenResponse Response = this->BuildResponse(Content); - OnSuccess(Response.Checkout); - }, OnFailure); + + SardineGetNFTCheckoutTokenSendRequest(ChainId, Order, RecipientAddress, MarketPlaceContractAddress, Quantity, "USDC", Step.Data, + OnSuccess, OnFailure); + } else + { + SardineGetNFTCheckoutTokenSendRequest(ChainId, Order, RecipientAddress, MarketPlaceContractAddress, Quantity, Order.Order.PriceCurrencyAddress, Step.Data, + OnSuccess, OnFailure); + } }), OnFailure); } + void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress, TArray data, TArray Proof) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h index 5aa65ff8b..17b832d83 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/SequenceCheckout.h @@ -56,7 +56,7 @@ class SEQUENCEPLUGIN_API USequenceCheckout : public UObject void GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; void GenerateBuyTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, TSuccessCallback OnSuccess, FFailureCallback OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") - void GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; + void GenerateBuyTransactionMultipleOrders(const FString& WalletAddress, const TArray Orders, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; void GenerateBuyTransaction(const FString& WalletAddress, const TArray Orders, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, TSuccessCallback OnSuccess, FFailureCallback OnFailure) const; UFUNCTION(BlueprintCallable, Category = "Checkout") void GenerateSellTransaction(const FString& WalletAddress, const FSeqOrder& Order, const int64 Amount, const FAdditionalFee& AdditionalFee, const EWalletKind WalletKind, FOnGenerateTransactionResponseSuccess OnSuccess, FOnCheckoutFailure OnFailure) const; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h index e4759855b..7e4304a80 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Sardine/SardineCheckout.h @@ -55,6 +55,9 @@ class SEQUENCEPLUGIN_API USardineCheckout : public UObject void GetSaleDetails(const FContractCall& SaleDetailsCall, long& Amount, long TokenID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); void SardineGetNFTCheckoutToken(const FSardineGetNFTCheckoutTokenArgs& Args, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutTokenSendRequest(int64 ChainId, FSeqCollectibleOrder Order, FString RecipientAddress, + FString MarketplaceContractAddress, long Quantity, FString PriceSymbol, FString CallData, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); public: //public functions From 9b72872d14d5bb0fe0eb0c24f95525b0018691d7 Mon Sep 17 00:00:00 2001 From: Jan Dohring Date: Tue, 8 Apr 2025 15:42:39 -0400 Subject: [PATCH 47/48] blueprinting start --- .../Private/Integrators/SardineCheckoutBP.cpp | 19 +++++ .../Public/Integrators/SardineCheckoutBP.h | 84 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp new file mode 100644 index 000000000..fdaa4c17c --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp @@ -0,0 +1,19 @@ +#include "Integrators/SardineCheckoutBP.h" + +void USardineCheckoutBP::CheckSardineWhiteListStatus(FString Address, FOnCheckSardineWhiteListStatus OnSuccess, + FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->CheckSardineWhiteListStatus(Address, [OnSuccess](bool Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(Error); + } + }); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h new file mode 100644 index 000000000..531c0c3ce --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h @@ -0,0 +1,84 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Checkout/SequenceCheckout.h" +#include "Subsystems/GameInstanceSubsystem.h" +#include "Sequence/SequenceResponseIntent.h" +#include "Marketplace/Sardine/SardineCheckout.h" +#include "SardineCheckoutBP.generated.h" + +UDELEGATE(BlueprintAuthorityOnly) +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnCheckSardineWhiteListStatus, bool, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetClientToken, FString, Response); + +UDELEGATE(BlueprintAuthorityOnly) +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineCheckoutFailure, FSequenceError, Error); + +UCLASS() +class SEQUENCEPLUGIN_API USardineCheckoutBP : public UGameInstanceSubsystem +{ + GENERATED_BODY() + + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + + USardineCheckout* SardineCheckout; + +public: + USardineCheckoutBP(); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void CheckSardineWhiteListStatus(FString Address, FOnCheckSardineWhiteListStatus OnSuccess, FOnSardineCheckoutFailure OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetQuote(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString WalletAddress, FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType = Credit, + TOptional QuotedCurrency = TOptional(), + ESardineQuoteType QuoteType = Buy); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetClientToken(FOnSardineGetClientToken OnSuccess, FOnSardineCheckoutFailure OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void OnRamp(const FString& ClientToken); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetNFTCheckoutToken(int64 ChainId, const FString& WalletAddress, TArray Orders, long Quantity, FString RecipientAddress, TArray + AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const + FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, long Amount, + TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", + TArray data = TArray(), TArray Proof = TArray()); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetNFTCheckoutToken(int64 ChainId, UERC721SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetSupportedRegions(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetSupportedFiatCurrencies(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetSupportedTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void SardineGetEnabledTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + FString CheckoutURL(FString ClientToken); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + FString CheckoutURL(FSardineNFTCheckout Token); + + UFUNCTION(BlueprintCallable, Category = "Checkout") + void Checkout(FSardineNFTCheckout Token); + +}; From 8881194e1f25b4757d54f0913eb60ccfceb57a71 Mon Sep 17 00:00:00 2001 From: Jan Dohring Date: Tue, 8 Apr 2025 16:45:39 -0400 Subject: [PATCH 48/48] blueprints --- .../Private/Integrators/SardineCheckoutBP.cpp | 217 +++++++++++++++++- .../Marketplace/Sardine/SardineCheckout.cpp | 8 +- .../Public/Integrators/SardineCheckoutBP.h | 48 ++-- 3 files changed, 246 insertions(+), 27 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp index fdaa4c17c..2ee6ecc77 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Integrators/SardineCheckoutBP.cpp @@ -1,7 +1,11 @@ #include "Integrators/SardineCheckoutBP.h" +USardineCheckoutBP::USardineCheckoutBP(): SardineCheckout(NewObject()) +{ +} + void USardineCheckoutBP::CheckSardineWhiteListStatus(FString Address, FOnCheckSardineWhiteListStatus OnSuccess, - FOnSardineCheckoutFailure OnFailure) + FOnSardineCheckoutFailure OnFailure) { SardineCheckout->CheckSardineWhiteListStatus(Address, [OnSuccess](bool Response) { @@ -13,7 +17,216 @@ void USardineCheckoutBP::CheckSardineWhiteListStatus(FString Address, FOnCheckSa { if(OnFailure.IsBound()) { - OnFailure.Execute(Error); + OnFailure.Execute(); + } + }); +} + +void USardineCheckoutBP::SardineGetQuote(FOnSardineGetQuote OnSuccess, FOnSardineCheckoutFailure OnFailure, + FString WalletAddress, FSardineToken Token, int Amount, FSardineFiatCurrency QuotedCurrency, ESardinePaymentType PaymentType,ESardineQuoteType QuoteType) +{ + SardineCheckout->SardineGetQuote([OnSuccess](FSardineQuote Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }, WalletAddress, Token, Amount, PaymentType, QuotedCurrency, QuoteType); +} + +void USardineCheckoutBP::SardineGetClientToken(FOnSardineGetClientToken OnSuccess, FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetClientToken([OnSuccess](FString Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +void USardineCheckoutBP::OnRamp(const FString& ClientToken) +{ + SardineCheckout->OnRamp(ClientToken); +} + +void USardineCheckoutBP::SardineGetNFTCheckoutTokenOrders(int64 ChainId, const FString& WalletAddress, + TArray Orders, int Quantity, FString RecipientAddress, TArray AdditionalFee, + FString MarketPlaceContractAddress, FOnSardineGetNFTCheckoutToken OnSuccess, FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetNFTCheckoutToken(ChainId, WalletAddress, Orders, Quantity, RecipientAddress, AdditionalFee, MarketPlaceContractAddress, + [OnSuccess](FSardineNFTCheckout Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +void USardineCheckoutBP::SardineGetNFTCheckoutTokenERC1155(int64 ChainId, UERC1155SaleContract* SaleContract, + FString CollectionAddress, int TokenID, int Amount, FOnSardineGetNFTCheckoutToken OnSuccess, + FOnSardineCheckoutFailure OnFailure, TArray data, TArray Proof, FString RecipientAddress) +{ + SardineCheckout->SardineGetNFTCheckoutToken(ChainId, SaleContract, CollectionAddress, TokenID, Amount, [OnSuccess](FSardineNFTCheckout Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }, RecipientAddress, data, Proof); +} + +void USardineCheckoutBP::SardineGetNFTCheckoutTokenERC721(int64 ChainID, UERC721SaleContract* SaleContract, + FString CollectionAddress, int TokenID, int Amount, FOnSardineGetNFTCheckoutToken OnSuccess, + FOnSardineCheckoutFailure OnFailure, FString RecipientAddress, TArray data, TArray Proof) +{ + SardineCheckout->SardineGetNFTCheckoutToken(ChainID, SaleContract, CollectionAddress, TokenID, Amount, [OnSuccess](FSardineNFTCheckout Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }, RecipientAddress, data, Proof); +} + +void USardineCheckoutBP::SardineGetNFTCheckoutOrderStatus(FString OrderID, + FOnSardineGetNFTCheckoutOrderStatus OnSuccess, FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetNFTCheckoutOrderStatus(OrderID, [OnSuccess](FSardineOrder Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +void USardineCheckoutBP::SardineGetSupportedRegions(FOnSardineGetSupportedRegions OnSuccess, + FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetSupportedRegions([OnSuccess](TArray Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); } }); } + +void USardineCheckoutBP::SardineGetSupportedFiatCurrencies(FOnSardineGetSupportedFiatCurrencies OnSuccess, + FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetSupportedFiatCurrencies([OnSuccess](TArray Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +void USardineCheckoutBP::SardineGetSupportedTokens(FOnSardineGetSupportedTokens OnSuccess, + FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetSupportedTokens([OnSuccess](TArray Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +void USardineCheckoutBP::SardineGetEnabledTokens(FOnSardineGetEnabledTokens OnSuccess, + FOnSardineCheckoutFailure OnFailure) +{ + SardineCheckout->SardineGetEnabledTokens([OnSuccess](TArray Response) + { + if(OnSuccess.IsBound()) + { + OnSuccess.Execute(Response); + } + }, [OnFailure](FSequenceError Error) + { + if(OnFailure.IsBound()) + { + OnFailure.Execute(); + } + }); +} + +FString USardineCheckoutBP::CheckoutURL(FString ClientToken) +{ + return SardineCheckout->CheckoutURL(ClientToken); +} + +FString USardineCheckoutBP::CheckoutURLFromToken(FSardineNFTCheckout Token) +{ + return SardineCheckout->CheckoutURL(Token); +} + +void USardineCheckoutBP::Checkout(FSardineNFTCheckout Token) +{ + SardineCheckout->Checkout(Token); +} + + + + + + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp index 1618ba24f..8d4db2351 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Marketplace/Sardine/SardineCheckout.cpp @@ -539,9 +539,15 @@ void USardineCheckout::SardineGetNFTCheckoutToken(int64 ChainID, UERC721SaleCont }, OnFailure); } +void USardineCheckout::SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, + const FFailureCallback& OnFailure) +{ + //TODO: This needs to be finished +} + void USardineCheckout::SardineGetSupportedRegions(TSuccessCallback> OnSuccess, - const FFailureCallback& OnFailure) + const FFailureCallback& OnFailure) { const FString Endpoint = "SardineGetSupportedRegions"; HTTPPost(Endpoint, "", [this, OnSuccess](const FString& Content) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h index 531c0c3ce..d598d5d04 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Integrators/SardineCheckoutBP.h @@ -9,19 +9,24 @@ UDELEGATE(BlueprintAuthorityOnly) DECLARE_DYNAMIC_DELEGATE_OneParam(FOnCheckSardineWhiteListStatus, bool, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetQuote, FSardineQuote, Response); DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetClientToken, FString, Response); +DECLARE_DYNAMIC_DELEGATE(FOnRampAsync); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetNFTCheckoutToken, FSardineNFTCheckout, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetNFTCheckoutOrderStatus, FSardineOrder, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetSupportedRegions, TArray, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetSupportedFiatCurrencies, TArray, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetSupportedTokens, TArray, Response); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineGetEnabledTokens, TArray, Response); UDELEGATE(BlueprintAuthorityOnly) -DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSardineCheckoutFailure, FSequenceError, Error); +DECLARE_DYNAMIC_DELEGATE(FOnSardineCheckoutFailure); UCLASS() class SEQUENCEPLUGIN_API USardineCheckoutBP : public UGameInstanceSubsystem { GENERATED_BODY() - virtual void Initialize(FSubsystemCollectionBase& Collection) override; - virtual void Deinitialize() override; - USardineCheckout* SardineCheckout; public: @@ -31,9 +36,7 @@ class SEQUENCEPLUGIN_API USardineCheckoutBP : public UGameInstanceSubsystem void CheckSardineWhiteListStatus(FString Address, FOnCheckSardineWhiteListStatus OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetQuote(TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString WalletAddress, FSardineToken Token, u_long Amount, ESardinePaymentType PaymentType = Credit, - TOptional QuotedCurrency = TOptional(), - ESardineQuoteType QuoteType = Buy); + void SardineGetQuote(FOnSardineGetQuote OnSuccess, FOnSardineCheckoutFailure OnFailure, FString WalletAddress, FSardineToken Token, int Amount, FSardineFiatCurrency QuotedCurrency, ESardinePaymentType PaymentType = Credit, ESardineQuoteType QuoteType = Buy); UFUNCTION(BlueprintCallable, Category = "Checkout") void SardineGetClientToken(FOnSardineGetClientToken OnSuccess, FOnSardineCheckoutFailure OnFailure); @@ -42,41 +45,38 @@ class SEQUENCEPLUGIN_API USardineCheckoutBP : public UGameInstanceSubsystem void OnRamp(const FString& ClientToken); UFUNCTION(BlueprintCallable, Category = "Checkout") - void OnRampAsync(FString ClientToken, TFunction OnSuccess, const FFailureCallback& OnFailure); - - UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetNFTCheckoutToken(int64 ChainId, const FString& WalletAddress, TArray Orders, long Quantity, FString RecipientAddress, TArray - AdditionalFee, FString MarketPlaceContractAddress, TSuccessCallback OnSuccess, const - FFailureCallback& OnFailure); + void SardineGetNFTCheckoutTokenOrders(int64 ChainId, const FString& WalletAddress, TArray Orders, int Quantity, FString RecipientAddress, TArray + AdditionalFee, FString MarketPlaceContractAddress, FOnSardineGetNFTCheckoutToken OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetNFTCheckoutToken(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, long TokenID, long Amount, - TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", - TArray data = TArray(), TArray Proof = TArray()); + void SardineGetNFTCheckoutTokenERC1155(int64 ChainId, UERC1155SaleContract* SaleContract, FString CollectionAddress, int TokenID, int Amount, + FOnSardineGetNFTCheckoutToken OnSuccess, FOnSardineCheckoutFailure OnFailure, + TArray data, TArray Proof, FString RecipientAddress = ""); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetNFTCheckoutToken(int64 ChainId, UERC721SaleContract SaleContract, FString CollectionAddress, long TokenID, long Amount, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure, FString RecipientAddress = "", TArray data = TArray(),TArray Proof = TArray()); - + void SardineGetNFTCheckoutTokenERC721(int64 ChainID, UERC721SaleContract* SaleContract, FString CollectionAddress, int TokenID, + int Amount, FOnSardineGetNFTCheckoutToken OnSuccess, FOnSardineCheckoutFailure OnFailure, FString RecipientAddress, TArray data , TArray Proof); + UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetNFTCheckoutOrderStatus(FString OrderID, TSuccessCallback OnSuccess, const FFailureCallback& OnFailure); + void SardineGetNFTCheckoutOrderStatus(FString OrderID, FOnSardineGetNFTCheckoutOrderStatus OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetSupportedRegions(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + void SardineGetSupportedRegions(FOnSardineGetSupportedRegions OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetSupportedFiatCurrencies(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + void SardineGetSupportedFiatCurrencies(FOnSardineGetSupportedFiatCurrencies OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetSupportedTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + void SardineGetSupportedTokens(FOnSardineGetSupportedTokens OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") - void SardineGetEnabledTokens(TSuccessCallback> OnSuccess, const FFailureCallback& OnFailure); + void SardineGetEnabledTokens(FOnSardineGetEnabledTokens OnSuccess, FOnSardineCheckoutFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "Checkout") FString CheckoutURL(FString ClientToken); UFUNCTION(BlueprintCallable, Category = "Checkout") - FString CheckoutURL(FSardineNFTCheckout Token); + FString CheckoutURLFromToken(FSardineNFTCheckout Token); UFUNCTION(BlueprintCallable, Category = "Checkout") void Checkout(FSardineNFTCheckout Token);