From da71fea0e267aac36397f1b8631852ab86c7f4c8 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 17 Apr 2025 14:58:34 -0300 Subject: [PATCH 01/12] First commit Missing query contract functions, building contractcall function data, compressor and encoder --- .../Checkout/Transak/TransakCheckout.cpp | 97 +++++++++++++++++++ .../Transak/Structs/TransakContractId.h | 25 +++++ .../Checkout/Transak/Structs/TransakNFTData.h | 43 ++++++++ .../Checkout/Transak/Structs/TransakStructs.h | 5 + .../Public/Checkout/Transak/TransakCheckout.h | 47 +++++++++ .../Public/Types/ERC1155SaleContract.h | 22 +++++ 6 files changed, 239 insertions(+) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakStructs.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp new file mode 100644 index 000000000..b1663f118 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -0,0 +1,97 @@ +#include "Checkout/Transak/TransakCheckout.h" +#include "Misc/DateTime.h" +#include "Misc/Guid.h" +#include "Misc/Base64.h" +#include "Containers/StringConv.h" +#include "Misc/DefaultValueHelper.h" +#include "Engine/Engine.h" + +// Placeholder for external helpers +namespace CallDataCompressor +{ + FString Compress(const FString& In) + { + // Placeholder + return FBase64::Encode(In); + } +} + +namespace NftDataEncoder +{ + FString Encode(const FTransakNFTData& NftData) + { + // Placeholder + return FBase64::Encode(TEXT("{ \"sample\": \"nftData\" }")); + } +} + +FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId) +{ + if (ContractId.Chain != UEnum::GetValueAsString(Network)) + { + UE_LOG(LogTemp, Error, TEXT("Chain mismatch in TransakCheckout")); + return TEXT("Error: Chain mismatch"); + } + const FString WalletAddress = *Wallet->GetWalletAddress(); + const FString TransakCallData = CallDataCompressor::Compress(CallData); + const FString BaseUrl = TEXT("https://global.transak.com"); + const FString TContractId = ContractId.Id; + const FString TransakCryptocurrencyCode = ContractId.PriceTokenSymbol; + const FString TransakNftDataEncoded = NftDataEncoder::Encode(Item); + const int64 EstimatedGasLimit = 500000; + + //GASLIMIT ESTIMATOR USE NFTDATA.COLLECTIONADDRES -> Paramaeter not needed + + + const int64 Timestamp = FDateTime::UtcNow().ToUnixTimestamp(); + const FString PartnerOrderId = FString::Printf(TEXT("%s-%lld"), *WalletAddress, Timestamp); + + FString URL = FString::Printf(TEXT("%s?apiKey=%s&isNFT=true&calldata=%s&contractId=%s&cryptoCurrencyCode=%s&estimatedGasLimit=%lld&nftData=%s&walletAddress=%s&disableWalletAddressForm=true&partnerOrderId=%s"), + *BaseUrl, + *TEXT("YOUR_API_KEY_HERE"), // Replace with actual key or inject it + *TransakCallData, + *TContractId, + *TransakCryptocurrencyCode, + EstimatedGasLimit, + *TransakNftDataEncoded, + *WalletAddress, + *PartnerOrderId + ); + + return URL; +} + +FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract,const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data, const TArray& Proof) +{ + if (TransakNFTData.Quantity <= 0) + { + UE_LOG(LogTemp, Error, TEXT("Quantity must be greater than 0")); + return TEXT("Error: Invalid quantity"); + } + + FContractCall PaymentTokenContractCall = SaleContract->GetPaymentToken(); + TOptional PaymentToken = PaymentTokenContractCall.Data; + + FContractCall SaleDetailsContractCall = SaleContract->GetPaymentToken(); + TOptional SaleDetails = SaleDetailsContractCall.Data; + + //Missing actual queries + + int32 Decimals = PaymentTokenContract->GetDecimals(); //undefined + + FString CallData = //ContractCallFunction from unity( + TransakContractAddresses[Network], + { TokenId }, + { Quantity }, + Data, + PaymentToken, + SaleContract.SaleDetails.Cost * Quantity, + Proof + ); + + TArray TokenIDs = { TokenId }; + TArray Prices; + Prices.Add(DecimalNormalizer::ReturnToNormalPrecise(SaleDetails.Cost, Decimals)); + + return GetNFTCheckoutLink(TransakNFTData, CallData, ContractId); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h new file mode 100644 index 000000000..d56fd07eb --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h @@ -0,0 +1,25 @@ +#pragma once + +#include "CoreMinimal.h" +#include "TransakContractId.generated.h" + +// You may need to replace these forward declarations with actual types if you have them defined +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FTransakContractId +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString Id; + + // Assuming Address is a string or a custom wrapper, using FString for now + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString ContractAddress; + + // Assuming Chain is an enum, replace with appropriate type if needed + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString Chain; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString PriceTokenSymbol; +}; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h new file mode 100644 index 000000000..e58db582e --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h @@ -0,0 +1,43 @@ +#pragma once + +#include "CoreMinimal.h" +#include "TransakNftData.generated.h" + +// NFT Type Enum +UENUM(BlueprintType) +enum class ENFTType : uint8 +{ + ERC1155 UMETA(DisplayName = "ERC1155"), + ERC721 UMETA(DisplayName = "ERC721") +}; + +// Transak NFT Data Struct +USTRUCT(BlueprintType) +struct SEQUENCEPLUGIN_API FTransakNFTData +{ + GENERATED_BODY() + +public: + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString ImageURL; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString Name; + + // Assuming `Address` is a wrapper type in C#, use FString for now + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + FString CollectionAddress; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + TArray TokenID; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + TArray Price; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + int Quantity; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") + ENFTType Type; +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakStructs.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakStructs.h new file mode 100644 index 000000000..f51dd3484 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakStructs.h @@ -0,0 +1,5 @@ +#pragma once + +#include "TransakNFTData.h" +#include "TransakContractId.h" + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h new file mode 100644 index 000000000..1972ea428 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h @@ -0,0 +1,47 @@ +#pragma once + +#include "CoreMinimal.h" +#include "UObject/NoExportTypes.h" +#include "Marketplace/SequenceMarketplace.h" +#include "Marketplace/TransactionNFTCheckoutProvider.h" +#include "Checkout/SequenceCheckout.h" +#include "Types/ERC1155SaleContract.h" +#include "Sequence/SequenceWallet.h" +#include "Util/Structs/BE_Enums.h" +#include "Structs/TransakStructs.h" + +#include "TransakCheckout.generated.h" + + +UCLASS() +class SEQUENCEPLUGIN_API UTransakCheckout : public UObject +{ + GENERATED_BODY() + +public: + + UPROPERTY(BlueprintReadWrite, Category = "Transak") + USequenceWallet* Wallet; + + UPROPERTY(BlueprintReadWrite, Category = "Transak") + TEnumAsByte Network; + + UPROPERTY(BlueprintReadWrite, Category = "Transak") + USequenceCheckout* Checkout; + + UPROPERTY(BlueprintReadWrite, Category = "Transak") + USequenceMarketplace* Marketplace; + + UPROPERTY(BlueprintReadWrite, Category = "Transak") + FTransakContractId TransakContractId; + + + UFUNCTION(BlueprintCallable, Category = "Transak") + FString GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId); + + UFUNCTION(BlueprintCallable, Category = "Transak") + FString BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, + const TArray& Data, const TArray& Proof); + +}; + diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h index 17b824b0e..8aec3c0fd 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h @@ -36,5 +36,27 @@ class SEQUENCEPLUGIN_API UERC1155SaleContract : public UObject FContractCall GetGlobalSaleDetails(); + FString Abi = "[{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkMerkleProof\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMember\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMemberCount\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalSaleDetails\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"items\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expectedPaymentToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxTotal\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"paymentToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalSaleDetails\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPaymentToken\",\"inputs\":[{\"name\":\"paymentTokenAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawETH\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GlobalSaleDetailsUpdated\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSaleDetailsUpdated\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"GlobalSaleInactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientPayment\",\"inputs\":[{\"name\":\"currency\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientSupply\",\"inputs\":[{\"name\":\"currentSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSaleDetails\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenIds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MerkleProofInvalid\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SaleInactive\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawFailed\",\"inputs\":[]}]"; +}; + +USTRUCT(BlueprintType) +struct FERC1155SaleDetails +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") + FString Cost; // Use FString or a custom BigInt class + + UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") + FString SupplyCap; // Same here + + UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") + int64 StartTime; // Use int64 for Unix timestamps + + UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") + int64 EndTime; + + UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") + FString MerkleRoot; // Represent as hex string }; \ No newline at end of file From e8447c053d8bdb21b1f217360dd5c4547da4566c Mon Sep 17 00:00:00 2001 From: caballoninja Date: Tue, 22 Apr 2025 10:06:14 -0300 Subject: [PATCH 02/12] erc1155 --- .../Boilerplates/Pawn_SequenceDemo.uasset | 4 +- .../Checkout/Transak/CallDataCompressor.cpp | 35 ++++++ .../Checkout/Transak/TransakCheckout.cpp | 108 +++++++++++------- .../Transak/TransakNFTDataEncoder.cpp | 42 +++++++ .../Checkout/Transak/CallDataCompressor.h | 9 ++ .../Public/Checkout/Transak/TransakCheckout.h | 6 + .../Checkout/Transak/TransakNFTDataEncoder.h | 9 ++ .../Public/Types/ERC1155SaleContract.h | 2 +- Source/SequenceUnreal/SequenceUnreal.Build.cs | 2 +- 9 files changed, 172 insertions(+), 45 deletions(-) create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h create mode 100644 Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h diff --git a/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset b/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset index 539aebd8a..73f0d740d 100644 --- a/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset +++ b/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2aded93c46d64067c221b58625436ea99208c7b5aa802535187b3a54cee05c2 -size 104263 +oid sha256:178b6cef138205a43c03c30e9566797eaf43937975380bd6494f82268b3ad0d9 +size 117069 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp new file mode 100644 index 000000000..d28dc078a --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp @@ -0,0 +1,35 @@ +#include "Checkout/Transak/CallDataCompressor.h" +#include "Misc/Base64.h" +#include "Misc/Compression.h" +#include "GenericPlatform/GenericPlatformHttp.h" // ✅ Correct for UrlEncode + +FString CallDataCompressor::Compress(const FString& In) +{ + FTCHARToUTF8 Converter(*In); + const uint8* UncompressedData = reinterpret_cast(Converter.Get()); + int32 UncompressedSize = Converter.Length(); + + int32 CompressedBufferSize = FCompression::CompressMemoryBound(NAME_Zlib, UncompressedSize); + TArray CompressedData; + CompressedData.SetNumUninitialized(CompressedBufferSize); + + int32 CompressedSize = CompressedBufferSize; + bool bSuccess = FCompression::CompressMemory( + NAME_Zlib, + CompressedData.GetData(), + CompressedSize, + UncompressedData, + UncompressedSize, + COMPRESS_Default + ); + + if (!bSuccess) + { + UE_LOG(LogTemp, Error, TEXT("CallData compression failed")); + return TEXT("CompressionError"); + } + + CompressedData.SetNum(CompressedSize); + FString Base64 = FBase64::Encode(CompressedData); + return FGenericPlatformHttp::UrlEncode(Base64); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index b1663f118..34209a4ff 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -5,25 +5,9 @@ #include "Containers/StringConv.h" #include "Misc/DefaultValueHelper.h" #include "Engine/Engine.h" - -// Placeholder for external helpers -namespace CallDataCompressor -{ - FString Compress(const FString& In) - { - // Placeholder - return FBase64::Encode(In); - } -} - -namespace NftDataEncoder -{ - FString Encode(const FTransakNFTData& NftData) - { - // Placeholder - return FBase64::Encode(TEXT("{ \"sample\": \"nftData\" }")); - } -} +#include "Checkout/Transak/CallDataCompressor.h" +#include "Checkout/Transak/TransakNFTDataEncoder.h" +#include "Checkout/Structs/TransactionStep.h" FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId) { @@ -37,7 +21,7 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const const FString BaseUrl = TEXT("https://global.transak.com"); const FString TContractId = ContractId.Id; const FString TransakCryptocurrencyCode = ContractId.PriceTokenSymbol; - const FString TransakNftDataEncoded = NftDataEncoder::Encode(Item); + const FString TransakNftDataEncoded = TransakNFTDataEncoder::Encode(Item); const int64 EstimatedGasLimit = 500000; //GASLIMIT ESTIMATOR USE NFTDATA.COLLECTIONADDRES -> Paramaeter not needed @@ -69,29 +53,71 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* return TEXT("Error: Invalid quantity"); } - FContractCall PaymentTokenContractCall = SaleContract->GetPaymentToken(); - TOptional PaymentToken = PaymentTokenContractCall.Data; - - FContractCall SaleDetailsContractCall = SaleContract->GetPaymentToken(); - TOptional SaleDetails = SaleDetailsContractCall.Data; + TArray TokenIds; + TArray Amounts; - //Missing actual queries - - int32 Decimals = PaymentTokenContract->GetDecimals(); //undefined + for (const FString& TokenIDString : TransakNFTData.TokenID) + { + int32 ParsedTokenId = FCString::Atoi(*TokenIDString); + TokenIds.Add(ParsedTokenId); + Amounts.Add(TransakNFTData.Quantity); + } - FString CallData = //ContractCallFunction from unity( - TransakContractAddresses[Network], - { TokenId }, - { Quantity }, - Data, - PaymentToken, - SaleContract.SaleDetails.Cost * Quantity, + FString callData = SaleContract->MakePurchaseTransaction( + Wallet->GetWalletAddress(), + TokenIds, + Amounts, Proof - ); + ).data; - TArray TokenIDs = { TokenId }; - TArray Prices; - Prices.Add(DecimalNormalizer::ReturnToNormalPrecise(SaleDetails.Cost, Decimals)); - - return GetNFTCheckoutLink(TransakNFTData, CallData, ContractId); + return GetNFTCheckoutLink(TransakNFTData, callData, ContractId); } +void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder order, int64 quantity, ENFTType type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback) +{ + if (quantity <= 0) + { + UE_LOG(LogTemp, Error, TEXT("Invalid quantity")); + OnSuccessCallback.ExecuteIfBound(TEXT("Error: Invalid quantity")); + return; + } + + TArray TokenIds = { FString::FromInt(order.TokenMetadata.tokenId) }; + TArray Prices = { static_cast(order.Order.PriceUSD) }; + + FTransakNFTData NFTData( + order.TokenMetadata.image, + order.TokenMetadata.name, + order.TokenMetadata.contractAddress, + TokenIds, + Prices, + quantity, + ENFTType::ERC1155 + ); + + FTransakContractId TransakContractID; //Endpoint isntead of this ? + TransakContractID.Id = FString::FromInt(order.TokenMetadata.tokenId); + TransakContractID.ContractAddress = order.TokenMetadata.contractAddress; + TransakContractID.Chain = FString::FromInt(order.Order.ChainId); + TransakContractID.PriceTokenSymbol = "USD"; + + Checkout->GenerateBuyTransaction( + order.Order.ChainId, + Wallet->GetWalletAddress(), + order.Order, + quantity, + AdditionalFee, + EWalletKind::Sequence, + + [this, NFTData, TransakContractID, OnSuccessCallback](const FGenerateTransactionResponse& Response) + { + const FString URL = GetNFTCheckoutLink(NFTData, *Response.Steps[0].ExtractBuyStep(Response.Steps).Data, TransakContractID); + OnSuccessCallback.ExecuteIfBound(URL); + }, + + [OnSuccessCallback](const FSequenceError& Error) + { + UE_LOG(LogTemp, Error, TEXT("Failed to generate buy transaction: %s"), *Error.Message); + OnSuccessCallback.ExecuteIfBound(TEXT("Error: Failed to generate transaction")); + } + ); +} \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp new file mode 100644 index 000000000..9bc0a3248 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp @@ -0,0 +1,42 @@ +#include "Checkout/Transak/TransakNFTDataEncoder.h" +#include "Serialization/JsonWriter.h" +#include "Serialization/JsonSerializer.h" +#include "Dom/JsonObject.h" +#include "Misc/Base64.h" + +namespace TransakNFTDataEncoder +{ + FString Encode(const FTransakNFTData& NftData) + { + TSharedRef JsonObject = MakeShared(); + + JsonObject->SetStringField(TEXT("imageUrl"), NftData.ImageURL); + JsonObject->SetStringField(TEXT("name"), NftData.Name); + JsonObject->SetStringField(TEXT("collectionAddress"), NftData.CollectionAddress); + + TArray> TokenIDs; + for (const FString& TokenID : NftData.TokenID) + { + TokenIDs.Add(MakeShared(TokenID)); + } + JsonObject->SetArrayField(TEXT("tokenId"), TokenIDs); + + TArray> Prices; + for (float Price : NftData.Price) + { + Prices.Add(MakeShared(Price)); + } + JsonObject->SetArrayField(TEXT("price"), Prices); + + JsonObject->SetNumberField(TEXT("quantity"), NftData.Quantity); + JsonObject->SetStringField(TEXT("type"), UEnum::GetValueAsString(NftData.Type)); + + // Serialize to string + FString OutputString; + TSharedRef> Writer = TJsonWriterFactory<>::Create(&OutputString); + FJsonSerializer::Serialize(JsonObject, Writer); + + // Base64 encode JSON + return FBase64::Encode(OutputString); + } +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h new file mode 100644 index 000000000..88aabd5ca --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h @@ -0,0 +1,9 @@ +#pragma once + +#include "CoreMinimal.h" + +namespace CallDataCompressor +{ + // Compresses call data using Deflate + Base64 + URI escape + SEQUENCEPLUGIN_API FString Compress(const FString& In); +} \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h index 1972ea428..5cb49086d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h @@ -3,6 +3,7 @@ #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "Marketplace/SequenceMarketplace.h" +#include "Marketplace/Structs/SeqCollectibleOrder.h" #include "Marketplace/TransactionNFTCheckoutProvider.h" #include "Checkout/SequenceCheckout.h" #include "Types/ERC1155SaleContract.h" @@ -12,6 +13,7 @@ #include "TransakCheckout.generated.h" +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnTransakCheckoutGenerated, const FString&, CheckoutURL); UCLASS() class SEQUENCEPLUGIN_API UTransakCheckout : public UObject @@ -39,9 +41,13 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject UFUNCTION(BlueprintCallable, Category = "Transak") FString GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId); + UFUNCTION(BlueprintCallable, Category = "Transak") FString BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data, const TArray& Proof); + UFUNCTION(BlueprintCallable, Category = "Transak") + void BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder Order, int64 Quantity, ENFTType Type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback); + }; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h new file mode 100644 index 000000000..f1ce12ed9 --- /dev/null +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h @@ -0,0 +1,9 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Checkout/Transak/Structs/TransakNFTData.h" + +namespace TransakNFTDataEncoder +{ + FString Encode(const FTransakNFTData& NftData); +} diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h index 8aec3c0fd..d7774759f 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h @@ -36,7 +36,7 @@ class SEQUENCEPLUGIN_API UERC1155SaleContract : public UObject FContractCall GetGlobalSaleDetails(); - FString Abi = "[{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkMerkleProof\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMember\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMemberCount\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalSaleDetails\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"items\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expectedPaymentToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxTotal\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"paymentToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalSaleDetails\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPaymentToken\",\"inputs\":[{\"name\":\"paymentTokenAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawETH\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GlobalSaleDetailsUpdated\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSaleDetailsUpdated\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"GlobalSaleInactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientPayment\",\"inputs\":[{\"name\":\"currency\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientSupply\",\"inputs\":[{\"name\":\"currentSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSaleDetails\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenIds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MerkleProofInvalid\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SaleInactive\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawFailed\",\"inputs\":[]}]"; + //FString Abi = "[{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkMerkleProof\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMember\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMemberCount\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalSaleDetails\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"items\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expectedPaymentToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxTotal\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"paymentToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalSaleDetails\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPaymentToken\",\"inputs\":[{\"name\":\"paymentTokenAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawETH\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GlobalSaleDetailsUpdated\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSaleDetailsUpdated\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"GlobalSaleInactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientPayment\",\"inputs\":[{\"name\":\"currency\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientSupply\",\"inputs\":[{\"name\":\"currentSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSaleDetails\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenIds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MerkleProofInvalid\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SaleInactive\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawFailed\",\"inputs\":[]}]"; }; diff --git a/Source/SequenceUnreal/SequenceUnreal.Build.cs b/Source/SequenceUnreal/SequenceUnreal.Build.cs index 76b00abb3..b26e2e77a 100644 --- a/Source/SequenceUnreal/SequenceUnreal.Build.cs +++ b/Source/SequenceUnreal/SequenceUnreal.Build.cs @@ -8,7 +8,7 @@ public SequenceUnreal(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; CppStandard = CppStandardVersion.Cpp20; - PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "SequencePlugin" }); + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "SequencePlugin", "HTTP" }); //PublicIncludePaths.AddRange(new string[] {"/Public/" , "/Private/"}); From 92d4faff3b271347148b371d1d6e58964bbf2bce Mon Sep 17 00:00:00 2001 From: caballoninja Date: Fri, 25 Apr 2025 10:03:11 -0300 Subject: [PATCH 03/12] Encoder and compressor tests --- .../Checkout/Transak/CallDataCompressor.cpp | 4 +- .../Checkout/Transak/TransakCheckout.cpp | 5 +- .../Transak/TransakNFTDataEncoder.cpp | 94 ++++++++++++------- .../Checkout/Transak/CallDataCompressor.h | 11 ++- .../Checkout/Transak/TransakNFTDataEncoder.h | 10 +- .../CheckoutTests/TransakDataEncoderTests.cpp | 45 +++++++++ 6 files changed, 124 insertions(+), 45 deletions(-) create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/TransakDataEncoderTests.cpp diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp index d28dc078a..35efa105e 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/CallDataCompressor.cpp @@ -1,9 +1,9 @@ #include "Checkout/Transak/CallDataCompressor.h" #include "Misc/Base64.h" #include "Misc/Compression.h" -#include "GenericPlatform/GenericPlatformHttp.h" // ✅ Correct for UrlEncode +#include "GenericPlatform/GenericPlatformHttp.h" -FString CallDataCompressor::Compress(const FString& In) +FString FCallDataCompressor::Compress(const FString& In) { FTCHARToUTF8 Converter(*In); const uint8* UncompressedData = reinterpret_cast(Converter.Get()); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index 34209a4ff..0c28b44b1 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -16,12 +16,13 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const UE_LOG(LogTemp, Error, TEXT("Chain mismatch in TransakCheckout")); return TEXT("Error: Chain mismatch"); } + const FString WalletAddress = *Wallet->GetWalletAddress(); - const FString TransakCallData = CallDataCompressor::Compress(CallData); + const FString TransakCallData = FCallDataCompressor::Compress(CallData); const FString BaseUrl = TEXT("https://global.transak.com"); const FString TContractId = ContractId.Id; const FString TransakCryptocurrencyCode = ContractId.PriceTokenSymbol; - const FString TransakNftDataEncoded = TransakNFTDataEncoder::Encode(Item); + const FString TransakNftDataEncoded = FTransakNFTDataEncoder::Encode(Item); const int64 EstimatedGasLimit = 500000; //GASLIMIT ESTIMATOR USE NFTDATA.COLLECTIONADDRES -> Paramaeter not needed diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp index 9bc0a3248..bed07cdb7 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp @@ -1,42 +1,68 @@ #include "Checkout/Transak/TransakNFTDataEncoder.h" #include "Serialization/JsonWriter.h" +#include "Policies/CondensedJsonPrintPolicy.h" #include "Serialization/JsonSerializer.h" #include "Dom/JsonObject.h" +#include "Dom/JsonValue.h" #include "Misc/Base64.h" +#include "GenericPlatform/GenericPlatformHttp.h" -namespace TransakNFTDataEncoder +FString FTransakNFTDataEncoder::Encode(const FTransakNFTData& NftData) { - FString Encode(const FTransakNFTData& NftData) - { - TSharedRef JsonObject = MakeShared(); - - JsonObject->SetStringField(TEXT("imageUrl"), NftData.ImageURL); - JsonObject->SetStringField(TEXT("name"), NftData.Name); - JsonObject->SetStringField(TEXT("collectionAddress"), NftData.CollectionAddress); - - TArray> TokenIDs; - for (const FString& TokenID : NftData.TokenID) - { - TokenIDs.Add(MakeShared(TokenID)); - } - JsonObject->SetArrayField(TEXT("tokenId"), TokenIDs); - - TArray> Prices; - for (float Price : NftData.Price) - { - Prices.Add(MakeShared(Price)); - } - JsonObject->SetArrayField(TEXT("price"), Prices); - - JsonObject->SetNumberField(TEXT("quantity"), NftData.Quantity); - JsonObject->SetStringField(TEXT("type"), UEnum::GetValueAsString(NftData.Type)); - - // Serialize to string - FString OutputString; - TSharedRef> Writer = TJsonWriterFactory<>::Create(&OutputString); - FJsonSerializer::Serialize(JsonObject, Writer); - - // Base64 encode JSON - return FBase64::Encode(OutputString); - } + // Build the JSON object for the single NFT + TSharedRef JsonObject = MakeShared(); + JsonObject->SetStringField(TEXT("imageURL"), NftData.ImageURL); + JsonObject->SetStringField(TEXT("nftName"), NftData.Name); + JsonObject->SetStringField(TEXT("collectionAddress"), NftData.CollectionAddress); + + // tokenID array + TArray> TokenIDArray; + for (const FString& TokenID : NftData.TokenID) + { + TokenIDArray.Add(MakeShared(TokenID)); + } + JsonObject->SetArrayField(TEXT("tokenID"), TokenIDArray); + + // price array with high-precision formatting + TArray> PriceArray; + for (double Price : NftData.Price) + { + double RoundedPrice = FMath::RoundToDouble(Price * 100000.0) / 100000.0; + PriceArray.Add(MakeShared(RoundedPrice)); + } + JsonObject->SetArrayField(TEXT("price"), PriceArray); + + // quantity + JsonObject->SetNumberField(TEXT("quantity"), static_cast(NftData.Quantity)); + + // nftType (strip enum prefix) + FString EnumStr = UEnum::GetValueAsString(NftData.Type).Replace(TEXT("ENFTType::"), TEXT("")); + JsonObject->SetStringField(TEXT("nftType"), EnumStr); + + // Wrap object in an array + TArray> JsonArray; + JsonArray.Add(MakeShared(JsonObject)); + + // Serialize to minified (condensed) JSON + FString JsonString; + TSharedRef>> Writer =TJsonWriterFactory>::Create(&JsonString); + + if (!FJsonSerializer::Serialize(JsonArray, Writer)) + { + return TEXT(""); + } + + // Base64 encode the JSON string (already padded) + FString Base64Encoded = FBase64::Encode(JsonString); + + // Log Base64 output for debugging + UE_LOG(LogTemp, Log, TEXT("Base64 Encoded (with padding): %s"), *Base64Encoded); + + // URL encode the Base64 string + FString UrlEncoded = FGenericPlatformHttp::UrlEncode(Base64Encoded); + + // Log URL encoded string + UE_LOG(LogTemp, Log, TEXT("URL Encoded: %s"), *UrlEncoded); + + return UrlEncoded; } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h index 88aabd5ca..111075118 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h @@ -2,8 +2,11 @@ #include "CoreMinimal.h" -namespace CallDataCompressor +/** + * Utility class for compressing call data using Deflate + Base64 + URI encoding. + */ +class SEQUENCEPLUGIN_API FCallDataCompressor { - // Compresses call data using Deflate + Base64 + URI escape - SEQUENCEPLUGIN_API FString Compress(const FString& In); -} \ No newline at end of file +public: + static FString Compress(const FString& In); +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h index f1ce12ed9..1db0b83c5 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h @@ -3,7 +3,11 @@ #include "CoreMinimal.h" #include "Checkout/Transak/Structs/TransakNFTData.h" -namespace TransakNFTDataEncoder +/** + * Utility class to encode Transak NFT data into a URL-friendly string. + */ +class SEQUENCEPLUGIN_API FTransakNFTDataEncoder { - FString Encode(const FTransakNFTData& NftData); -} +public: + static FString Encode(const FTransakNFTData& NftData); +}; \ No newline at end of file diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/TransakDataEncoderTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/TransakDataEncoderTests.cpp new file mode 100644 index 000000000..8ede86e59 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/TransakDataEncoderTests.cpp @@ -0,0 +1,45 @@ +// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved. + +#include "CoreMinimal.h" +#include "Misc/AutomationTest.h" +#include "SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h" +#include "SequencePlugin/Public/Checkout/Transak/TransakNFTDataEncoder.h" +#include "SequencePlugin/Public/Checkout/Transak/CallDataCompressor.h" + + +IMPLEMENT_SIMPLE_AUTOMATION_TEST(FTransakNFTDataEncoderTests, "SequencePlugin.EndToEnd.CheckoutTests.Transak.NFTDataEncoder", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +bool FTransakNFTDataEncoderTests::RunTest(const FString& Parameters) +{ + FString ImageURL = TEXT("https://dev-metadata.sequence.app/projects/1010/collections/394/tokens/1/image.png"); + FString Name = TEXT("Keaton T-322"); + FString CollectionAddress = TEXT("0xdeb398f41ccd290ee5114df7e498cf04fac916cb"); + TArray TokenIDs = { TEXT("1") }; + TArray Prices = { 0.02f }; + int32 Quantity = 1; + + FTransakNFTData Data(ImageURL, Name, CollectionAddress, TokenIDs, Prices, Quantity, ENFTType::ERC1155); + + FString EncodedData = FTransakNFTDataEncoder::Encode(Data); + + FString Expected = TEXT("W3siaW1hZ2VVUkwiOiJodHRwczovL2Rldi1tZXRhZGF0YS5zZXF1ZW5jZS5hcHAvcHJvamVjdHMvMTAxMC9jb2xsZWN0aW9ucy8zOTQvdG9rZW5zLzEvaW1hZ2UucG5nIiwibmZ0TmFtZSI6IktlYXRvbiBULTMyMiIsImNvbGxlY3Rpb25BZGRyZXNzIjoiMHhkZWIzOThmNDFjY2QyOTBlZTUxMTRkZjdlNDk4Y2YwNGZhYzkxNmNiIiwidG9rZW5JRCI6WyIxIl0sInByaWNlIjpbMC4wMl0sInF1YW50aXR5IjoxLCJuZnRUeXBlIjoiRVJDMTE1NSJ9XQ%3D%3D"); + + TestEqual(TEXT("Encoded NFT Data matches expected output"), EncodedData, Expected); + + return true; +} + +IMPLEMENT_SIMPLE_AUTOMATION_TEST(FTestCallDataCompressor, "SequencePlugin.EndToEnd.CheckoutTests.Transak.CallDataCompressor", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +bool FTestCallDataCompressor::RunTest(const FString& Parameters) +{ + FString Calldata = TEXT("0x60e606f60000000000000000000000004a598b7ec77b1562ad0df7dc64a162695ce4c78a00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c33590000000000000000000000000000000000000000000000000000000000004e2000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000"); + + FString Compressed = FCallDataCompressor::Compress(Calldata); + + FString Expected = TEXT("eJztkMsNxDAIBVsC8zPlOIBrSPmbBiytxCGXzI3DvAfArVAKuhUO8BKfl1WYXSg6VkJuy1BeqENdojhsrpP%2FH9XTcTT94%2FlAwe4hPKK2FE3EQvRnMsgZAZQSROKdeq7u%2Fs33Pwmf%2Fyrt%2Fh9Zdb5R"); + + TestEqual(TEXT("Compressed calldata matches expected output"), Compressed, Expected); + + return true; +} \ No newline at end of file From 97d6261ff33874e95a437da54f1f7383bdfcf9b8 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Fri, 25 Apr 2025 14:56:05 -0300 Subject: [PATCH 04/12] TransakCheckout fixes --- .../Checkout/Transak/TransakCheckout.cpp | 68 ++++++++++++++++--- .../Public/Checkout/Transak/TransakCheckout.h | 8 ++- .../CheckoutTests/BuildTransakLinksTests.cpp | 51 ++++++++++++++ 3 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index 0c28b44b1..e378e1a9b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -8,6 +8,7 @@ #include "Checkout/Transak/CallDataCompressor.h" #include "Checkout/Transak/TransakNFTDataEncoder.h" #include "Checkout/Structs/TransactionStep.h" +#include "Util/SequenceSupport.h" FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId) { @@ -17,7 +18,6 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const return TEXT("Error: Chain mismatch"); } - const FString WalletAddress = *Wallet->GetWalletAddress(); const FString TransakCallData = FCallDataCompressor::Compress(CallData); const FString BaseUrl = TEXT("https://global.transak.com"); const FString TContractId = ContractId.Id; @@ -33,7 +33,7 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString URL = FString::Printf(TEXT("%s?apiKey=%s&isNFT=true&calldata=%s&contractId=%s&cryptoCurrencyCode=%s&estimatedGasLimit=%lld&nftData=%s&walletAddress=%s&disableWalletAddressForm=true&partnerOrderId=%s"), *BaseUrl, - *TEXT("YOUR_API_KEY_HERE"), // Replace with actual key or inject it + *TEXT("5911d9ec-46b5-48fa-a755-d59a715ff0cf"), // This can be hardcoded as it is a public API key *TransakCallData, *TContractId, *TransakCryptocurrencyCode, @@ -46,7 +46,7 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const return URL; } -FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract,const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data, const TArray& Proof) +FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract,const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data ,const TArray& Proof) { if (TransakNFTData.Quantity <= 0) { @@ -65,7 +65,7 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* } FString callData = SaleContract->MakePurchaseTransaction( - Wallet->GetWalletAddress(), + WalletAddress, TokenIds, Amounts, Proof @@ -73,6 +73,7 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* return GetNFTCheckoutLink(TransakNFTData, callData, ContractId); } + void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder order, int64 quantity, ENFTType type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback) { if (quantity <= 0) @@ -95,15 +96,13 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO ENFTType::ERC1155 ); - FTransakContractId TransakContractID; //Endpoint isntead of this ? - TransakContractID.Id = FString::FromInt(order.TokenMetadata.tokenId); - TransakContractID.ContractAddress = order.TokenMetadata.contractAddress; - TransakContractID.Chain = FString::FromInt(order.Order.ChainId); - TransakContractID.PriceTokenSymbol = "USD"; + FTransakContractId TransakContractID = GetTransakContractIdFromCollectibleOrder(order); + + if (TransakContractID.Id.IsEmpty())return; Checkout->GenerateBuyTransaction( order.Order.ChainId, - Wallet->GetWalletAddress(), + WalletAddress, order.Order, quantity, AdditionalFee, @@ -121,4 +120,53 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO OnSuccessCallback.ExecuteIfBound(TEXT("Error: Failed to generate transaction")); } ); +} + +FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FSeqCollectibleOrder order) +{ + FTransakContractId TransakContractID; + + // Check the chain ID and set the contract info + if (order.Order.ChainId == 137) // Polygon + { + // Map the MarketplaceKind to OrderbookKind and set the corresponding contract info + + switch (order.Order.Marketplace) + { + case EMarketplaceKind::SEQUENCE_MARKETPLACE_V2: + TransakContractID.Id = TEXT("67ac543448035690a20ac131"); + TransakContractID.ContractAddress = TEXT("0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"); + TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::PolygonChain); // Or as a string: TEXT("Polygon") + TransakContractID.PriceTokenSymbol = TEXT("POL"); + break; + + default: + // Default case for unknown or unhandled marketplace kinds + TransakContractID.Id = TEXT("6675a6d0f597abb8f3e2e9c2"); + TransakContractID.ContractAddress = TEXT("0xc2c862322e9c97d6244a3506655da95f05246fd8"); + TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::PolygonChain); // Or as a string: TEXT("Polygon") + TransakContractID.PriceTokenSymbol = TEXT("MATIC"); + break; + } + + } + else if (order.Order.ChainId == 42161) // ArbitrumOne + { + // Map the MarketplaceKind to OrderbookKind and set the corresponding contract info + if (order.Order.Marketplace == EMarketplaceKind::SEQUENCE_MARKETPLACE_V2) + { + TransakContractID.Id = "66c5a2cf2fb1688e11fcb167"; + TransakContractID.ContractAddress = "0xB537a160472183f2150d42EB1c3DD6684A55f74c"; + TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::ArbitrumOne); + TransakContractID.PriceTokenSymbol = "USDC"; + } + else if (order.Order.Marketplace == EMarketplaceKind::SEQUENCE_MARKETPLACE_V1) + { + TransakContractID.Id = "66c5a2d8c00223b9cc6edfdc"; + TransakContractID.ContractAddress = "0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"; + TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::ArbitrumOne); + TransakContractID.PriceTokenSymbol = "USDC"; + } + } + return TransakContractID; } \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h index 5cb49086d..07ecc1231 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h @@ -23,7 +23,7 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject public: UPROPERTY(BlueprintReadWrite, Category = "Transak") - USequenceWallet* Wallet; + FString WalletAddress; UPROPERTY(BlueprintReadWrite, Category = "Transak") TEnumAsByte Network; @@ -44,10 +44,14 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject UFUNCTION(BlueprintCallable, Category = "Transak") FString BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, - const TArray& Data, const TArray& Proof); + const TArray& Data, + const TArray& Proof); UFUNCTION(BlueprintCallable, Category = "Transak") void BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder Order, int64 Quantity, ENFTType Type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback); + UFUNCTION(BlueprintCallable, Category = "Transak") + FTransakContractId GetTransakContractIdFromCollectibleOrder(FSeqCollectibleOrder order); + }; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp new file mode 100644 index 000000000..29d6515a2 --- /dev/null +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -0,0 +1,51 @@ +#include "Misc/AutomationTest.h" +#include "SequencePlugin/Public/Checkout/Transak/TransakCheckout.h" +#include "SequencePlugin/Public/Sequence/SequenceWallet.h" +#include "SequencePlugin/Public/Marketplace/SequenceMarketplace.h" +#include "SequencePlugin/Public/Checkout/SequenceCheckout.h" +#include "SequencePlugin/Public/Types/ERC1155SaleContract.h" + + +IMPLEMENT_SIMPLE_AUTOMATION_TEST(FTransakCheckoutLinkPrimarySaleTest, "SequencePlugin.EndToEnd.CheckoutTests.Transak.PrimarySaleERC1155", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) +{ + UTransakCheckout* Checkout = NewObject(); + Checkout->WalletAddress = "0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07"; + Checkout->Marketplace = NewObject(); + Checkout->Checkout = NewObject(); + Checkout->Network = ENetwork::ArbitrumOne; + + UERC1155SaleContract* SaleContract = NewObject(); + + SaleContract->ContractAddress = TEXT("0x624ec4ddfb5073b9dd49712036fd56ce895f366e"); + SaleContract->PaymentToken = TEXT("0xf3C3351D6Bd0098EEb33ca8f830FAf2a141Ea2E1"); + SaleContract->MaxTotal = 1; + SaleContract->Data = TEXT("0x0000000000000000000000000000000000000000000000000000000000000000"); + + + FTransakNFTData NFTData; + NFTData.ImageURL = TEXT("https://metadata.sequence.app/projects/158/collections/1233/tokens/0/image.png"); + NFTData.Name = TEXT("Icy Longsword"); + NFTData.CollectionAddress = TEXT("0x8e9609597f7376098ddfc441f45cae5f37057222"); + NFTData.TokenID = { TEXT("1") }; + NFTData.Price = { 0 }; + NFTData.Quantity = 1; + NFTData.Type = ENFTType::ERC1155; + + FTransakContractId ContractId; + ContractId.Id = "66c5a2cf2fb1688e11fcb167"; + ContractId.ContractAddress = "0xB537a160472183f2150d42EB1c3DD6684A55f74c"; + ContractId.Chain = UEnum::GetValueAsString(ENetwork::ArbitrumOne); + ContractId.PriceTokenSymbol = "USDC"; + + TArray data; // Empty Data + TArray proof; + + FString Link = Checkout->BuildNFTCheckoutLinkFromERC1155(SaleContract, NFTData, ContractId, data, proof); + + TestFalse(TEXT("Failed"), Link.IsEmpty()); + + return true; + +} From 3034f3dd4b48bf8d22e8727389384b7c2b39fa01 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Fri, 25 Apr 2025 15:47:49 -0300 Subject: [PATCH 05/12] Test Fix --- .../Checkout/Transak/TransakCheckout.cpp | 84 ++++++++++++++----- .../CheckoutTests/BuildTransakLinksTests.cpp | 2 +- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index e378e1a9b..72ba22567 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -9,45 +9,79 @@ #include "Checkout/Transak/TransakNFTDataEncoder.h" #include "Checkout/Structs/TransactionStep.h" #include "Util/SequenceSupport.h" - FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId) { - if (ContractId.Chain != UEnum::GetValueAsString(Network)) + UE_LOG(LogTemp, Warning, TEXT("Entered GetNFTCheckoutLink")); + + const FString NetworkString = UEnum::GetValueAsString(Network); + UE_LOG(LogTemp, Warning, TEXT("NetworkString: %s"), *NetworkString); + UE_LOG(LogTemp, Warning, TEXT("Provided ContractId.Chain: %s"), *ContractId.Chain); + + if (ContractId.Chain != NetworkString) { UE_LOG(LogTemp, Error, TEXT("Chain mismatch in TransakCheckout")); return TEXT("Error: Chain mismatch"); } + UE_LOG(LogTemp, Warning, TEXT("Compressing call data...")); const FString TransakCallData = FCallDataCompressor::Compress(CallData); - const FString BaseUrl = TEXT("https://global.transak.com"); + UE_LOG(LogTemp, Warning, TEXT("Compressed call data: %s"), *TransakCallData); + + UE_LOG(LogTemp, Warning, TEXT("Encoding NFT data...")); + const FString TransakNftDataEncoded = FTransakNFTDataEncoder::Encode(Item); + UE_LOG(LogTemp, Warning, TEXT("Base64 Encoded (with padding): %s"), *TransakNftDataEncoded); + + const FString BaseURL = TEXT("https://global.transak.com"); + UE_LOG(LogTemp, Warning, TEXT("BaseURL: %s"), *BaseURL); + const FString TContractId = ContractId.Id; const FString TransakCryptocurrencyCode = ContractId.PriceTokenSymbol; - const FString TransakNftDataEncoded = FTransakNFTDataEncoder::Encode(Item); const int64 EstimatedGasLimit = 500000; - //GASLIMIT ESTIMATOR USE NFTDATA.COLLECTIONADDRES -> Paramaeter not needed + if (WalletAddress.IsEmpty()) + { + UE_LOG(LogTemp, Error, TEXT("WalletAddress is not set!")); + return TEXT("Error: Wallet address missing"); + } + UE_LOG(LogTemp, Warning, TEXT("WalletAddress: %s"), *WalletAddress); const int64 Timestamp = FDateTime::UtcNow().ToUnixTimestamp(); + UE_LOG(LogTemp, Warning, TEXT("Timestamp: %lld"), Timestamp); + const FString PartnerOrderId = FString::Printf(TEXT("%s-%lld"), *WalletAddress, Timestamp); - FString URL = FString::Printf(TEXT("%s?apiKey=%s&isNFT=true&calldata=%s&contractId=%s&cryptoCurrencyCode=%s&estimatedGasLimit=%lld&nftData=%s&walletAddress=%s&disableWalletAddressForm=true&partnerOrderId=%s"), - *BaseUrl, - *TEXT("5911d9ec-46b5-48fa-a755-d59a715ff0cf"), // This can be hardcoded as it is a public API key - *TransakCallData, - *TContractId, - *TransakCryptocurrencyCode, - EstimatedGasLimit, - *TransakNftDataEncoded, - *WalletAddress, - *PartnerOrderId - ); + UE_LOG(LogTemp, Warning, TEXT("Building final URL...")); + + FString address = *WalletAddress; + FString URL = + BaseURL + TEXT("?apiKey=5911d9ec-46b5-48fa-a755-d59a715ff0cf") + + TEXT("&isNFT=true") + + TEXT("&calldata=") + TransakCallData + + TEXT("&contractId=") + TContractId + + TEXT("&cryptoCurrencyCode=") + TransakCryptocurrencyCode + + TEXT("&estimatedGasLimit=") + FString::Printf(TEXT("%lld"), EstimatedGasLimit) + + TEXT("&nftData=") + TransakNftDataEncoded + + TEXT("&walletAddress=") + address + + TEXT("&disableWalletAddressForm=true") + + TEXT("&partnerOrderId=") + PartnerOrderId; + + UE_LOG(LogTemp, Warning, TEXT("Final URL: %s"), *URL); return URL; } -FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract,const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data ,const TArray& Proof) + +FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data, const TArray& Proof) { + UE_LOG(LogTemp, Warning, TEXT("Entered BuildNFTCheckoutLinkFromERC1155")); + + if (!SaleContract) + { + UE_LOG(LogTemp, Error, TEXT("SaleContract is nullptr!")); + return TEXT("Error: Invalid SaleContract"); + } + if (TransakNFTData.Quantity <= 0) { UE_LOG(LogTemp, Error, TEXT("Quantity must be greater than 0")); @@ -57,23 +91,31 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* TArray TokenIds; TArray Amounts; + UE_LOG(LogTemp, Warning, TEXT("Processing Token IDs...")); for (const FString& TokenIDString : TransakNFTData.TokenID) { int32 ParsedTokenId = FCString::Atoi(*TokenIDString); TokenIds.Add(ParsedTokenId); - Amounts.Add(TransakNFTData.Quantity); + Amounts.Add(TransakNFTData.Quantity); + UE_LOG(LogTemp, Warning, TEXT("Parsed TokenID: %d, Quantity: %d"), ParsedTokenId, TransakNFTData.Quantity); } - FString callData = SaleContract->MakePurchaseTransaction( + UE_LOG(LogTemp, Warning, TEXT("Calling MakePurchaseTransaction on SaleContract...")); + + + FRawTransaction result = SaleContract->MakePurchaseTransaction( WalletAddress, TokenIds, Amounts, Proof - ).data; + ); + FString callData = result.data; + + + UE_LOG(LogTemp, Warning, TEXT("Transaction callData: %s"), *callData); return GetNFTCheckoutLink(TransakNFTData, callData, ContractId); } - void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder order, int64 quantity, ENFTType type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback) { if (quantity <= 0) diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp index 29d6515a2..0fe3f4c3d 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -11,7 +11,7 @@ IMPLEMENT_SIMPLE_AUTOMATION_TEST(FTransakCheckoutLinkPrimarySaleTest, "SequenceP bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) { UTransakCheckout* Checkout = NewObject(); - Checkout->WalletAddress = "0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07"; + Checkout->WalletAddress = FString(TEXT("0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07")); Checkout->Marketplace = NewObject(); Checkout->Checkout = NewObject(); Checkout->Network = ENetwork::ArbitrumOne; From 85fc707cc45ab5a2cffd55c21f8a935aa4c08427 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Mon, 28 Apr 2025 10:22:33 -0300 Subject: [PATCH 06/12] Fixed test contract data --- .../CheckoutTests/BuildTransakLinksTests.cpp | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp index 0fe3f4c3d..3577aaf70 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -4,7 +4,7 @@ #include "SequencePlugin/Public/Marketplace/SequenceMarketplace.h" #include "SequencePlugin/Public/Checkout/SequenceCheckout.h" #include "SequencePlugin/Public/Types/ERC1155SaleContract.h" - +#include "SequencePlugin/Private/Provider.h" IMPLEMENT_SIMPLE_AUTOMATION_TEST(FTransakCheckoutLinkPrimarySaleTest, "SequencePlugin.EndToEnd.CheckoutTests.Transak.PrimarySaleERC1155", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) @@ -14,32 +14,31 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) Checkout->WalletAddress = FString(TEXT("0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07")); Checkout->Marketplace = NewObject(); Checkout->Checkout = NewObject(); - Checkout->Network = ENetwork::ArbitrumOne; + Checkout->Network = ENetwork::PolygonChain; UERC1155SaleContract* SaleContract = NewObject(); SaleContract->ContractAddress = TEXT("0x624ec4ddfb5073b9dd49712036fd56ce895f366e"); - SaleContract->PaymentToken = TEXT("0xf3C3351D6Bd0098EEb33ca8f830FAf2a141Ea2E1"); - SaleContract->MaxTotal = 1; + SaleContract->PaymentToken = TEXT("0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"); + SaleContract->MaxTotal = 2000; SaleContract->Data = TEXT("0x0000000000000000000000000000000000000000000000000000000000000000"); - - + FTransakNFTData NFTData; - NFTData.ImageURL = TEXT("https://metadata.sequence.app/projects/158/collections/1233/tokens/0/image.png"); - NFTData.Name = TEXT("Icy Longsword"); + NFTData.ImageURL = TEXT("https://dev-metadata.sequence.app/projects/1010/collections/394/tokens/1/image.png"); + NFTData.Name = TEXT("Keaton T-322"); NFTData.CollectionAddress = TEXT("0x8e9609597f7376098ddfc441f45cae5f37057222"); NFTData.TokenID = { TEXT("1") }; - NFTData.Price = { 0 }; + NFTData.Price = { 0.02 }; NFTData.Quantity = 1; NFTData.Type = ENFTType::ERC1155; FTransakContractId ContractId; - ContractId.Id = "66c5a2cf2fb1688e11fcb167"; - ContractId.ContractAddress = "0xB537a160472183f2150d42EB1c3DD6684A55f74c"; - ContractId.Chain = UEnum::GetValueAsString(ENetwork::ArbitrumOne); + ContractId.Id = "674eb5613d739107bbd18ed2"; + ContractId.ContractAddress = "0xe65b75eb7c58ffc0bf0e671d64d0e1c6cd0d3e5b"; + ContractId.Chain = UEnum::GetValueAsString(ENetwork::PolygonChain); ContractId.PriceTokenSymbol = "USDC"; - TArray data; // Empty Data + TArray data; TArray proof; FString Link = Checkout->BuildNFTCheckoutLinkFromERC1155(SaleContract, NFTData, ContractId, data, proof); From 7bbd346da856743bb8231c045711862b34e03f9e Mon Sep 17 00:00:00 2001 From: caballoninja Date: Mon, 28 Apr 2025 10:59:56 -0300 Subject: [PATCH 07/12] more fixes --- .../Private/Checkout/Transak/TransakCheckout.cpp | 2 +- .../Private/CheckoutTests/BuildTransakLinksTests.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index 72ba22567..ae8a1291d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -31,7 +31,7 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const const FString TransakNftDataEncoded = FTransakNFTDataEncoder::Encode(Item); UE_LOG(LogTemp, Warning, TEXT("Base64 Encoded (with padding): %s"), *TransakNftDataEncoded); - const FString BaseURL = TEXT("https://global.transak.com"); + const FString BaseURL = TEXT("https://global.transak.com/"); UE_LOG(LogTemp, Warning, TEXT("BaseURL: %s"), *BaseURL); const FString TContractId = ContractId.Id; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp index 3577aaf70..fce0d1d35 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -45,6 +45,10 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) TestFalse(TEXT("Failed"), Link.IsEmpty()); + FString ExpectedLink = TEXT("https://global.transak.com/?apiKey=5911d9ec-46b5-48fa-a755-d59a715ff0cf&isNFT=true&calldata=eJzlkMENBSEIRFsaQFDLUcAafvnfBkw28bCHfZw4vCEMfoY02DIcCM41Jy9qc6UEm0624OHZpADDVEQH6sl%2FRt7pxJf%2B8X2Il95dC3suTWlESdT3VhHNHRLqu4F%2Bdb%2FGlQ667G8nfNsvLKhN8O68yR9x%2Fcs7&contractId=674eb5613d739107bbd18ed2&cryptoCurrencyCode=USDC&estimatedGasLimit=500000&nftData=W3siaW1hZ2VVUkwiOiJodHRwczovL2Rldi1tZXRhZGF0YS5zZXF1ZW5jZS5hcHAvcHJvamVjdHMvMTAxMC9jb2xsZWN0aW9ucy8zOTQvdG9rZW5zLzEvaW1hZ2UucG5nIiwibmZ0TmFtZSI6IktlYXRvbiBULTMyMiIsImNvbGxlY3Rpb25BZGRyZXNzIjoiMHg4ZTk2MDk1OTdmNzM3NjA5OGRkZmM0NDFmNDVjYWU1ZjM3MDU3MjIyIiwidG9rZW5JRCI6WyIxIl0sInByaWNlIjpbMC4wMl0sInF1YW50aXR5IjoxLCJuZnRUeXBlIjoiRVJDMTE1NSJ9XQ%3D%3D&walletAddress=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07&disableWalletAddressForm=true&partnerOrderId=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07"); + TestTrue(TEXT("TransakNFTCheckoutLink starts with expectedLink"), Link.StartsWith(ExpectedLink)); + + return true; } From f49191466262ea4b4829ec9e6c82e86661581fa0 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Tue, 29 Apr 2025 12:53:29 -0300 Subject: [PATCH 08/12] more fixes to test --- .../Boilerplates/Pawn_SequenceDemo.uasset | 4 ++-- .../Checkout/Transak/TransakCheckout.cpp | 24 +++++++++++++++++-- .../Public/Checkout/Transak/TransakCheckout.h | 11 ++++----- .../CheckoutTests/BuildTransakLinksTests.cpp | 12 ++++------ 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset b/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset index 73f0d740d..474d9a150 100644 --- a/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset +++ b/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:178b6cef138205a43c03c30e9566797eaf43937975380bd6494f82268b3ad0d9 -size 117069 +oid sha256:32de78925bd8031cb9496805422fb909552ad96b48ff9dbb572d80d4671e2b33 +size 166067 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index ae8a1291d..3902e4253 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -104,7 +104,7 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* FRawTransaction result = SaleContract->MakePurchaseTransaction( - WalletAddress, + TransakContractAddresses[Network], TokenIds, Amounts, Proof @@ -142,6 +142,8 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO if (TransakContractID.Id.IsEmpty())return; + USequenceCheckout* Checkout = NewObject< USequenceCheckout>(); + Checkout->GenerateBuyTransaction( order.Order.ChainId, WalletAddress, @@ -211,4 +213,22 @@ FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FS } } return TransakContractID; -} \ No newline at end of file +} + + +const TMap UTransakCheckout::TransakContractAddresses = { + {ENetwork::Ethereum, TEXT("0xab88cd272863b197b48762ea283f24a13f6586dd")}, + {ENetwork::Sepolia, TEXT("0xD84aC4716A082B1F7eCDe9301aA91A7c4B62ECd7")}, + {ENetwork::PolygonChain, TEXT("0x4A598B7eC77b1562AD0dF7dc64a162695cE4c78A")}, + {ENetwork::PolygonAmoy, TEXT("0xCB9bD5aCD627e8FcCf9EB8d4ba72AEb1Cd8Ff5EF")}, + {ENetwork::BNBSmartChain, TEXT("0x4A598B7eC77b1562AD0dF7dc64a162695cE4c78A")}, + {ENetwork::BNBSmartChainTestnet, TEXT("0x0E9539455944BE8a307bc43B0a046613a1aD6732")}, + {ENetwork::ArbitrumOne, TEXT("0x4A598B7eC77b1562AD0dF7dc64a162695cE4c78A")}, + {ENetwork::ArbitrumSepolia, TEXT("0x489F56e3144FF03A887305839bBCD20FF767d3d1")}, + {ENetwork::Optimism, TEXT("0x4A598B7eC77b1562AD0dF7dc64a162695cE4c78A")}, + {ENetwork::OptimismSepolia, TEXT("0xCB9bD5aCD627e8FcCf9EB8d4ba72AEb1Cd8Ff5EF")}, + {ENetwork::Immutable, TEXT("0x8b83dE7B20059864C479640CC33426935DC5F85b")}, + {ENetwork::ImmutableTestnet, TEXT("0x489F56e3144FF03A887305839bBCD20FF767d3d1")}, + {ENetwork::Base, TEXT("0x8b83dE7B20059864C479640CC33426935DC5F85b")}, + {ENetwork::BaseSepolia, TEXT("0xCB9bD5aCD627e8FcCf9EB8d4ba72AEb1Cd8Ff5EF")} +}; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h index 07ecc1231..2b6846da0 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h @@ -15,7 +15,7 @@ DECLARE_DYNAMIC_DELEGATE_OneParam(FOnTransakCheckoutGenerated, const FString&, CheckoutURL); -UCLASS() +UCLASS(Blueprintable) class SEQUENCEPLUGIN_API UTransakCheckout : public UObject { GENERATED_BODY() @@ -28,15 +28,11 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject UPROPERTY(BlueprintReadWrite, Category = "Transak") TEnumAsByte Network; - UPROPERTY(BlueprintReadWrite, Category = "Transak") - USequenceCheckout* Checkout; - - UPROPERTY(BlueprintReadWrite, Category = "Transak") - USequenceMarketplace* Marketplace; UPROPERTY(BlueprintReadWrite, Category = "Transak") FTransakContractId TransakContractId; + static const TMap TransakContractAddresses; UFUNCTION(BlueprintCallable, Category = "Transak") FString GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId); @@ -53,5 +49,6 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject UFUNCTION(BlueprintCallable, Category = "Transak") FTransakContractId GetTransakContractIdFromCollectibleOrder(FSeqCollectibleOrder order); -}; + +}; diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp index fce0d1d35..ee839148d 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -12,21 +12,19 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) { UTransakCheckout* Checkout = NewObject(); Checkout->WalletAddress = FString(TEXT("0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07")); - Checkout->Marketplace = NewObject(); - Checkout->Checkout = NewObject(); Checkout->Network = ENetwork::PolygonChain; UERC1155SaleContract* SaleContract = NewObject(); - SaleContract->ContractAddress = TEXT("0x624ec4ddfb5073b9dd49712036fd56ce895f366e"); + SaleContract->ContractAddress = TEXT("0xe65b75eb7c58ffc0bf0e671d64d0e1c6cd0d3e5b"); SaleContract->PaymentToken = TEXT("0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"); - SaleContract->MaxTotal = 2000; - SaleContract->Data = TEXT("0x0000000000000000000000000000000000000000000000000000000000000000"); + SaleContract->MaxTotal = 20000; + SaleContract->Data = TEXT("Minted using the Sequence Unity SDK"); FTransakNFTData NFTData; NFTData.ImageURL = TEXT("https://dev-metadata.sequence.app/projects/1010/collections/394/tokens/1/image.png"); NFTData.Name = TEXT("Keaton T-322"); - NFTData.CollectionAddress = TEXT("0x8e9609597f7376098ddfc441f45cae5f37057222"); + NFTData.CollectionAddress = TEXT("0xdeb398f41ccd290ee5114df7e498cf04fac916cb"); NFTData.TokenID = { TEXT("1") }; NFTData.Price = { 0.02 }; NFTData.Quantity = 1; @@ -45,7 +43,7 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) TestFalse(TEXT("Failed"), Link.IsEmpty()); - FString ExpectedLink = TEXT("https://global.transak.com/?apiKey=5911d9ec-46b5-48fa-a755-d59a715ff0cf&isNFT=true&calldata=eJzlkMENBSEIRFsaQFDLUcAafvnfBkw28bCHfZw4vCEMfoY02DIcCM41Jy9qc6UEm0624OHZpADDVEQH6sl%2FRt7pxJf%2B8X2Il95dC3suTWlESdT3VhHNHRLqu4F%2Bdb%2FGlQ667G8nfNsvLKhN8O68yR9x%2Fcs7&contractId=674eb5613d739107bbd18ed2&cryptoCurrencyCode=USDC&estimatedGasLimit=500000&nftData=W3siaW1hZ2VVUkwiOiJodHRwczovL2Rldi1tZXRhZGF0YS5zZXF1ZW5jZS5hcHAvcHJvamVjdHMvMTAxMC9jb2xsZWN0aW9ucy8zOTQvdG9rZW5zLzEvaW1hZ2UucG5nIiwibmZ0TmFtZSI6IktlYXRvbiBULTMyMiIsImNvbGxlY3Rpb25BZGRyZXNzIjoiMHg4ZTk2MDk1OTdmNzM3NjA5OGRkZmM0NDFmNDVjYWU1ZjM3MDU3MjIyIiwidG9rZW5JRCI6WyIxIl0sInByaWNlIjpbMC4wMl0sInF1YW50aXR5IjoxLCJuZnRUeXBlIjoiRVJDMTE1NSJ9XQ%3D%3D&walletAddress=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07&disableWalletAddressForm=true&partnerOrderId=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07"); + FString ExpectedLink = TEXT("https://global.transak.com/?apiKey=5911d9ec-46b5-48fa-a755-d59a715ff0cf&isNFT=true&calldata=eJzlT0kSwzAI%2BxKrMM9xMHlDn9%2Bk90w742N1kgABoheoQThBD7DpOY7oijjYIXPROmMVbDIE6dVWMeaT%2Fzf0np1l0%2F8Yn7Qss9yk%2BvTWwdzMeamgNapIl5eq5855693%2Fp%2B4tIP5vv6gtJDoMDhMKD7014uKGARdyhQeHXxMN%2FVRulmGRd9fMjs0UX%2FEGjwG76g%3D%3D&contractId=674eb5613d739107bbd18ed2&cryptoCurrencyCode=USDC&estimatedGasLimit=500000&nftData=W3siaW1hZ2VVUkwiOiJodHRwczovL2Rldi1tZXRhZGF0YS5zZXF1ZW5jZS5hcHAvcHJvamVjdHMvMTAxMC9jb2xsZWN0aW9ucy8zOTQvdG9rZW5zLzEvaW1hZ2UucG5nIiwibmZ0TmFtZSI6IktlYXRvbiBULTMyMiIsImNvbGxlY3Rpb25BZGRyZXNzIjoiMHhkZWIzOThmNDFjY2QyOTBlZTUxMTRkZjdlNDk4Y2YwNGZhYzkxNmNiIiwidG9rZW5JRCI6WyIxIl0sInByaWNlIjpbMC4wMl0sInF1YW50aXR5IjoxLCJuZnRUeXBlIjoiRVJDMTE1NSJ9XQ%3D%3D&walletAddress=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07&disableWalletAddressForm=true&partnerOrderId=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07-"); TestTrue(TEXT("TransakNFTCheckoutLink starts with expectedLink"), Link.StartsWith(ExpectedLink)); From eedba10c71ed2436a9b80444f858c69b99af97f8 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 1 May 2025 08:11:58 -0300 Subject: [PATCH 09/12] fixed test and adjusted methods for geting link with collectible order --- .../Boilerplates/Pawn_SequenceDemo.uasset | 4 +- .../Checkout/Transak/TransakCheckout.cpp | 116 +++++++++++------- .../Transak/TransakNFTDataEncoder.cpp | 12 +- .../Subsystems/SequenceMarketplaceBP.cpp | 2 +- .../Transak/Structs/TransakContractId.h | 3 - .../Checkout/Transak/Structs/TransakNFTData.h | 3 - .../Public/Checkout/Transak/TransakCheckout.h | 7 +- .../Public/Indexer/Structs/SeqTokenMetaData.h | 6 + .../Marketplace/Structs/SeqCollectibleOrder.h | 17 ++- .../Public/Marketplace/Structs/SeqOrder.h | 13 +- .../Public/Subsystems/SequenceMarketplaceBP.h | 2 +- .../Public/Types/ERC1155SaleContract.h | 8 +- .../CheckoutTests/BuildTransakLinksTests.cpp | 4 +- 13 files changed, 104 insertions(+), 93 deletions(-) diff --git a/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset b/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset index 474d9a150..74fd9450d 100644 --- a/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset +++ b/Plugins/SequencePlugin/Content/Boilerplates/Pawn_SequenceDemo.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:32de78925bd8031cb9496805422fb909552ad96b48ff9dbb572d80d4671e2b33 -size 166067 +oid sha256:f232b591edc7c4df5db1d53941cc643c520bdf11367d1ed26d0128f1ff2d436d +size 107019 diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index 3902e4253..93b747f26 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -9,30 +9,26 @@ #include "Checkout/Transak/TransakNFTDataEncoder.h" #include "Checkout/Structs/TransactionStep.h" #include "Util/SequenceSupport.h" +void UTransakCheckout::Initialize(const FString& InWalletAddress, ENetwork InNetwork) +{ + WalletAddress = InWalletAddress; + Network = InNetwork; +} FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId) { - UE_LOG(LogTemp, Warning, TEXT("Entered GetNFTCheckoutLink")); - const FString NetworkString = UEnum::GetValueAsString(Network); - UE_LOG(LogTemp, Warning, TEXT("NetworkString: %s"), *NetworkString); - UE_LOG(LogTemp, Warning, TEXT("Provided ContractId.Chain: %s"), *ContractId.Chain); if (ContractId.Chain != NetworkString) { - UE_LOG(LogTemp, Error, TEXT("Chain mismatch in TransakCheckout")); - return TEXT("Error: Chain mismatch"); + UE_LOG(LogTemp, Error, TEXT("Chain mismatch: ContractId.Chain = %s, Network = %s"), *ContractId.Chain, *NetworkString); + return TEXT("Error: Chain mismatch. Transak Checkout object network must match the TransakContractId chain."); } - UE_LOG(LogTemp, Warning, TEXT("Compressing call data...")); const FString TransakCallData = FCallDataCompressor::Compress(CallData); - UE_LOG(LogTemp, Warning, TEXT("Compressed call data: %s"), *TransakCallData); - UE_LOG(LogTemp, Warning, TEXT("Encoding NFT data...")); const FString TransakNftDataEncoded = FTransakNFTDataEncoder::Encode(Item); - UE_LOG(LogTemp, Warning, TEXT("Base64 Encoded (with padding): %s"), *TransakNftDataEncoded); const FString BaseURL = TEXT("https://global.transak.com/"); - UE_LOG(LogTemp, Warning, TEXT("BaseURL: %s"), *BaseURL); const FString TContractId = ContractId.Id; const FString TransakCryptocurrencyCode = ContractId.PriceTokenSymbol; @@ -40,19 +36,14 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const if (WalletAddress.IsEmpty()) { - UE_LOG(LogTemp, Error, TEXT("WalletAddress is not set!")); - return TEXT("Error: Wallet address missing"); + return TEXT("Error: Transak Checkout object wallet address is missing"); } - UE_LOG(LogTemp, Warning, TEXT("WalletAddress: %s"), *WalletAddress); const int64 Timestamp = FDateTime::UtcNow().ToUnixTimestamp(); - UE_LOG(LogTemp, Warning, TEXT("Timestamp: %lld"), Timestamp); const FString PartnerOrderId = FString::Printf(TEXT("%s-%lld"), *WalletAddress, Timestamp); - UE_LOG(LogTemp, Warning, TEXT("Building final URL...")); - FString address = *WalletAddress; FString URL = @@ -74,34 +65,27 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data, const TArray& Proof) { - UE_LOG(LogTemp, Warning, TEXT("Entered BuildNFTCheckoutLinkFromERC1155")); if (!SaleContract) { - UE_LOG(LogTemp, Error, TEXT("SaleContract is nullptr!")); return TEXT("Error: Invalid SaleContract"); } if (TransakNFTData.Quantity <= 0) { - UE_LOG(LogTemp, Error, TEXT("Quantity must be greater than 0")); return TEXT("Error: Invalid quantity"); } TArray TokenIds; TArray Amounts; - UE_LOG(LogTemp, Warning, TEXT("Processing Token IDs...")); for (const FString& TokenIDString : TransakNFTData.TokenID) { int32 ParsedTokenId = FCString::Atoi(*TokenIDString); TokenIds.Add(ParsedTokenId); Amounts.Add(TransakNFTData.Quantity); - UE_LOG(LogTemp, Warning, TEXT("Parsed TokenID: %d, Quantity: %d"), ParsedTokenId, TransakNFTData.Quantity); } - UE_LOG(LogTemp, Warning, TEXT("Calling MakePurchaseTransaction on SaleContract...")); - FRawTransaction result = SaleContract->MakePurchaseTransaction( TransakContractAddresses[Network], @@ -113,7 +97,6 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* FString callData = result.data; - UE_LOG(LogTemp, Warning, TEXT("Transaction callData: %s"), *callData); return GetNFTCheckoutLink(TransakNFTData, callData, ContractId); } void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder order, int64 quantity, ENFTType type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback) @@ -121,10 +104,11 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO if (quantity <= 0) { UE_LOG(LogTemp, Error, TEXT("Invalid quantity")); - OnSuccessCallback.ExecuteIfBound(TEXT("Error: Invalid quantity")); return; } + UE_LOG(LogTemp, Log, TEXT("Building Transak checkout link from collectible order")); + TArray TokenIds = { FString::FromInt(order.TokenMetadata.tokenId) }; TArray Prices = { static_cast(order.Order.PriceUSD) }; @@ -135,14 +119,27 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO TokenIds, Prices, quantity, - ENFTType::ERC1155 + ENFTType::ERC721 ); + + UE_LOG(LogTemp, Warning, TEXT("NFT Image: %s"), *NFTData.ImageURL); + UE_LOG(LogTemp, Warning, TEXT("NFT Name: %s"), *NFTData.Name); + UE_LOG(LogTemp, Warning, TEXT("NFT Name: %s"), *NFTData.CollectionAddress); + UE_LOG(LogTemp, Warning, TEXT("NFT Name: %s"), *UEnum::GetValueAsString(NFTData.Type).RightChop(10)); + FTransakContractId TransakContractID = GetTransakContractIdFromCollectibleOrder(order); - if (TransakContractID.Id.IsEmpty())return; + if (TransakContractID.Id.IsEmpty()) + { + UE_LOG(LogTemp, Error, TEXT("TransakContractID is empty. Aborting.")); + return; + } + + UE_LOG(LogTemp, Log, TEXT("Using TransakContractID: %s"), *TransakContractID.Id); USequenceCheckout* Checkout = NewObject< USequenceCheckout>(); + UE_LOG(LogTemp, Log, TEXT("Initialized USequenceCheckout")); Checkout->GenerateBuyTransaction( order.Order.ChainId, @@ -154,7 +151,17 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO [this, NFTData, TransakContractID, OnSuccessCallback](const FGenerateTransactionResponse& Response) { + UE_LOG(LogTemp, Log, TEXT("Buy transaction generated successfully")); + + + UE_LOG(LogTemp, Log, TEXT("BuyStep Data JSON: %s"), *Response.Steps[0].ExtractBuyStep(Response.Steps).Data); + + const FString URL = GetNFTCheckoutLink(NFTData, *Response.Steps[0].ExtractBuyStep(Response.Steps).Data, TransakContractID); + + + UE_LOG(LogTemp, Log, TEXT("Generated Transak Checkout URL: %s"), *URL); + OnSuccessCallback.ExecuteIfBound(URL); }, @@ -168,50 +175,67 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FSeqCollectibleOrder order) { + UE_LOG(LogTemp, Log, TEXT("Resolving TransakContractId for ChainId: %d, Marketplace: %d"), order.Order.ChainId, static_cast(order.Order.Marketplace)); + FTransakContractId TransakContractID; - // Check the chain ID and set the contract info - if (order.Order.ChainId == 137) // Polygon + if (order.Order.ChainId == 137) { - // Map the MarketplaceKind to OrderbookKind and set the corresponding contract info - + UE_LOG(LogTemp, Log, TEXT("Chain: Polygon")); + switch (order.Order.Marketplace) { case EMarketplaceKind::SEQUENCE_MARKETPLACE_V2: + UE_LOG(LogTemp, Log, TEXT("Marketplace: SEQUENCE_MARKETPLACE_V2")); + TransakContractID.Id = TEXT("67ac543448035690a20ac131"); TransakContractID.ContractAddress = TEXT("0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"); - TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::PolygonChain); // Or as a string: TEXT("Polygon") + TransakContractID.Chain = TransakContractID.Chain = UEnum::GetValueAsString(ENetwork::PolygonChain); TransakContractID.PriceTokenSymbol = TEXT("POL"); + break; default: - // Default case for unknown or unhandled marketplace kinds + UE_LOG(LogTemp, Log, TEXT("Marketplace: default (likely SEQUENCE_MARKETPLACE_V1 or unknown)")); + TransakContractID.Id = TEXT("6675a6d0f597abb8f3e2e9c2"); TransakContractID.ContractAddress = TEXT("0xc2c862322e9c97d6244a3506655da95f05246fd8"); - TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::PolygonChain); // Or as a string: TEXT("Polygon") + TransakContractID.Chain = TransakContractID.Chain = UEnum::GetValueAsString(ENetwork::PolygonChain); TransakContractID.PriceTokenSymbol = TEXT("MATIC"); + break; } - } - else if (order.Order.ChainId == 42161) // ArbitrumOne + else if (order.Order.ChainId == 42161) { - // Map the MarketplaceKind to OrderbookKind and set the corresponding contract info + UE_LOG(LogTemp, Log, TEXT("Chain: Arbitrum")); + if (order.Order.Marketplace == EMarketplaceKind::SEQUENCE_MARKETPLACE_V2) { - TransakContractID.Id = "66c5a2cf2fb1688e11fcb167"; - TransakContractID.ContractAddress = "0xB537a160472183f2150d42EB1c3DD6684A55f74c"; - TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::ArbitrumOne); - TransakContractID.PriceTokenSymbol = "USDC"; + UE_LOG(LogTemp, Log, TEXT("Marketplace: SEQUENCE_MARKETPLACE_V2")); + + TransakContractID.Id = TEXT("66c5a2cf2fb1688e11fcb167"); + TransakContractID.ContractAddress = TEXT("0xB537a160472183f2150d42EB1c3DD6684A55f74c"); + TransakContractID.Chain = UEnum::GetValueAsString(ENetwork::ArbitrumOne); + TransakContractID.PriceTokenSymbol = TEXT("USDC"); } else if (order.Order.Marketplace == EMarketplaceKind::SEQUENCE_MARKETPLACE_V1) { - TransakContractID.Id = "66c5a2d8c00223b9cc6edfdc"; - TransakContractID.ContractAddress = "0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"; - TransakContractID.Chain = USequenceSupport::GetNetworkName(ENetwork::ArbitrumOne); - TransakContractID.PriceTokenSymbol = "USDC"; + UE_LOG(LogTemp, Log, TEXT("Marketplace: SEQUENCE_MARKETPLACE_V1")); + + TransakContractID.Id = TEXT("66c5a2d8c00223b9cc6edfdc"); + TransakContractID.ContractAddress = TEXT("0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"); + TransakContractID.Chain = UEnum::GetValueAsString(ENetwork::ArbitrumOne); + TransakContractID.PriceTokenSymbol = TEXT("USDC"); } } + + UE_LOG(LogTemp, Log, TEXT("Resolved TransakContractId: Id=%s, Address=%s, Chain=%s, TokenSymbol=%s"), + *TransakContractID.Id, + *TransakContractID.ContractAddress, + *TransakContractID.Chain, + *TransakContractID.PriceTokenSymbol); + return TransakContractID; } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp index bed07cdb7..8cca630f8 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakNFTDataEncoder.cpp @@ -9,13 +9,12 @@ FString FTransakNFTDataEncoder::Encode(const FTransakNFTData& NftData) { - // Build the JSON object for the single NFT + TSharedRef JsonObject = MakeShared(); JsonObject->SetStringField(TEXT("imageURL"), NftData.ImageURL); JsonObject->SetStringField(TEXT("nftName"), NftData.Name); JsonObject->SetStringField(TEXT("collectionAddress"), NftData.CollectionAddress); - // tokenID array TArray> TokenIDArray; for (const FString& TokenID : NftData.TokenID) { @@ -23,7 +22,6 @@ FString FTransakNFTDataEncoder::Encode(const FTransakNFTData& NftData) } JsonObject->SetArrayField(TEXT("tokenID"), TokenIDArray); - // price array with high-precision formatting TArray> PriceArray; for (double Price : NftData.Price) { @@ -32,18 +30,14 @@ FString FTransakNFTDataEncoder::Encode(const FTransakNFTData& NftData) } JsonObject->SetArrayField(TEXT("price"), PriceArray); - // quantity JsonObject->SetNumberField(TEXT("quantity"), static_cast(NftData.Quantity)); - // nftType (strip enum prefix) FString EnumStr = UEnum::GetValueAsString(NftData.Type).Replace(TEXT("ENFTType::"), TEXT("")); JsonObject->SetStringField(TEXT("nftType"), EnumStr); - // Wrap object in an array TArray> JsonArray; JsonArray.Add(MakeShared(JsonObject)); - // Serialize to minified (condensed) JSON FString JsonString; TSharedRef>> Writer =TJsonWriterFactory>::Create(&JsonString); @@ -52,16 +46,12 @@ FString FTransakNFTDataEncoder::Encode(const FTransakNFTData& NftData) return TEXT(""); } - // Base64 encode the JSON string (already padded) FString Base64Encoded = FBase64::Encode(JsonString); - // Log Base64 output for debugging UE_LOG(LogTemp, Log, TEXT("Base64 Encoded (with padding): %s"), *Base64Encoded); - // URL encode the Base64 string FString UrlEncoded = FGenericPlatformHttp::UrlEncode(Base64Encoded); - // Log URL encoded string UE_LOG(LogTemp, Log, TEXT("URL Encoded: %s"), *UrlEncoded); return UrlEncoded; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Subsystems/SequenceMarketplaceBP.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Subsystems/SequenceMarketplaceBP.cpp index 2cdb5959c..bdae71bfe 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Subsystems/SequenceMarketplaceBP.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Subsystems/SequenceMarketplaceBP.cpp @@ -27,7 +27,7 @@ void USequenceMarketplaceBP::ListCurrencies(FOnListCurrencies OnSuccess, FOnFail this->Marketplace->ListCurrencies(SequenceSdk::GetChainId(), OnApiSuccess, OnApiFailure); } -void USequenceMarketplaceBP::GetCollectiblesWithLowestListingsFirst(const FString& ContractAddress, const FSeqCollectiblesFilter& Filter, const FSeqMarketplacePage& Page, FOnGetCollectiblesWithLowestListingsFirst OnSuccess, FOnFailure OnFailure) +void USequenceMarketplaceBP::GetCollectiblesWithLowestListingsFirst(const FString& ContractAddress, const FSeqCollectiblesFilter& Filter, const FSeqMarketplacePage& Page, FOnFailure OnFailure, FOnGetCollectiblesWithLowestListingsFirst OnSuccess) { const TSuccessCallback OnApiSuccess = [this, OnSuccess](const FSeqListCollectiblesReturn& CollectiblesWithLowestListings) { diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h index d56fd07eb..588a1af5a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakContractId.h @@ -3,7 +3,6 @@ #include "CoreMinimal.h" #include "TransakContractId.generated.h" -// You may need to replace these forward declarations with actual types if you have them defined USTRUCT(BlueprintType) struct SEQUENCEPLUGIN_API FTransakContractId { @@ -12,11 +11,9 @@ struct SEQUENCEPLUGIN_API FTransakContractId UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") FString Id; - // Assuming Address is a string or a custom wrapper, using FString for now UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") FString ContractAddress; - // Assuming Chain is an enum, replace with appropriate type if needed UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") FString Chain; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h index e58db582e..447900c4a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/Structs/TransakNFTData.h @@ -3,7 +3,6 @@ #include "CoreMinimal.h" #include "TransakNftData.generated.h" -// NFT Type Enum UENUM(BlueprintType) enum class ENFTType : uint8 { @@ -11,7 +10,6 @@ enum class ENFTType : uint8 ERC721 UMETA(DisplayName = "ERC721") }; -// Transak NFT Data Struct USTRUCT(BlueprintType) struct SEQUENCEPLUGIN_API FTransakNFTData { @@ -25,7 +23,6 @@ struct SEQUENCEPLUGIN_API FTransakNFTData UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") FString Name; - // Assuming `Address` is a wrapper type in C#, use FString for now UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transak") FString CollectionAddress; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h index 2b6846da0..159640758 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h @@ -28,12 +28,11 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject UPROPERTY(BlueprintReadWrite, Category = "Transak") TEnumAsByte Network; - - UPROPERTY(BlueprintReadWrite, Category = "Transak") - FTransakContractId TransakContractId; - static const TMap TransakContractAddresses; + UFUNCTION(BlueprintCallable, Category = "Transak") + void Initialize(const FString& InWalletAddress, ENetwork InNetwork); + UFUNCTION(BlueprintCallable, Category = "Transak") FString GetNFTCheckoutLink(const FTransakNFTData& Item, const FString& CallData, const FTransakContractId& ContractId); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h index 09e3a31ba..5df533273 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Indexer/Structs/SeqTokenMetaData.h @@ -98,6 +98,12 @@ 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! + FString OutputString; + TSharedRef> Writer = TJsonWriterFactory<>::Create(&OutputString); + FJsonSerializer::Serialize(MakeShared(json_in), Writer); + + UE_LOG(LogTemp, Warning, TEXT("Received JSON: %s"), *OutputString); + UE_LOG(LogTemp, Warning, TEXT("seq token meta data setup start")); FString tokenIdString; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqCollectibleOrder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqCollectibleOrder.h index 1fbcf8142..3c279e72d 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqCollectibleOrder.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqCollectibleOrder.h @@ -33,20 +33,17 @@ struct SEQUENCEPLUGIN_API FSeqCollectibleOrder { UE_LOG(LogTemp, Warning, TEXT("seq collectible setup start")); - /* - const TSharedPtr* item; - if (json_in.TryGetObjectField(TEXT("metadata"), item)) + const TSharedPtr* metadataJsonIn; + if (json_in.TryGetObjectField(TEXT("metadata"), metadataJsonIn)) { - TokenMetadata.Setup(*item->Get()); + TokenMetadata.Setup(*metadataJsonIn->Get()); } - const TSharedPtr* orderItem; - if (json_in.TryGetObjectField(TEXT("order"), orderItem)) + const TSharedPtr* orderJsonIn; + if (json_in.TryGetObjectField(TEXT("order"), orderJsonIn)) { - Order.Setup(*orderItem->Get()); - }//*/ - - Order.Setup(json_in); + Order.Setup(*orderJsonIn->Get()); + } UE_LOG(LogTemp, Warning, TEXT("seq collectible setup done")); } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqOrder.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqOrder.h index c9dc50845..d8c1d0d8c 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqOrder.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Marketplace/Structs/SeqOrder.h @@ -156,6 +156,7 @@ struct SEQUENCEPLUGIN_API FSeqOrder void Setup(FJsonObject& json_in) { + OrderId = json_in.GetStringField(TEXT("orderId")); if (json_in.TryGetField(TEXT("marketplace"))) @@ -220,17 +221,17 @@ struct SEQUENCEPLUGIN_API FSeqOrder QuantityDecimals = json_in.GetNumberField(TEXT("quantityDecimals")); FeeBps = json_in.GetNumberField(TEXT("feeBps")); - if (json_in.HasField(TEXT("feeBreakdown"))) + if (json_in.HasField(TEXT("feeBreakdown"))) { - const TArray>& feeBreakdownArray = json_in.GetArrayField(TEXT("feeBreakdown")); + const TArray>& feeBreakdownArray = json_in.GetArrayField(TEXT("feeBreakdown")); FeeBreakdown.Empty(); - for (int32 i = 0; i < feeBreakdownArray.Num(); ++i) + for (int32 i = 0; i < feeBreakdownArray.Num(); ++i) { TSharedPtr feeValue = feeBreakdownArray[i]; if (feeValue->Type == EJson::Object) { - FSeqFeeBreakdown fee; - fee.Setup(*feeValue->AsObject()); + FSeqFeeBreakdown fee; + fee.Setup(*feeValue->AsObject()); FeeBreakdown.Add(fee); UE_LOG(LogTemp, Warning, TEXT("fee setup")); @@ -244,6 +245,6 @@ struct SEQUENCEPLUGIN_API FSeqOrder OrderUpdatedAt = json_in.GetStringField(TEXT("orderUpdatedAt")); CreatedAt = json_in.GetStringField(TEXT("createdAt")); UpdatedAt = json_in.GetStringField(TEXT("updatedAt")); - json_in.TryGetStringField(TEXT("deletedAt"), DeletedAt); + DeletedAt = json_in.GetStringField(TEXT("deletedAt")); } }; \ No newline at end of file diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Subsystems/SequenceMarketplaceBP.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Subsystems/SequenceMarketplaceBP.h index ac040b921..969d2251f 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Subsystems/SequenceMarketplaceBP.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Subsystems/SequenceMarketplaceBP.h @@ -39,7 +39,7 @@ class SEQUENCEPLUGIN_API USequenceMarketplaceBP : public UGameInstanceSubsystem void ListCurrencies(FOnListCurrencies OnSuccess, FOnFailure OnFailure); UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Marketplace") - void GetCollectiblesWithLowestListingsFirst(const FString& ContractAddress, const FSeqCollectiblesFilter& Filter, const FSeqMarketplacePage& Page, FOnGetCollectiblesWithLowestListingsFirst OnSuccess, FOnFailure OnFailure); + void GetCollectiblesWithLowestListingsFirst(const FString& ContractAddress, const FSeqCollectiblesFilter& Filter, const FSeqMarketplacePage& Page, FOnFailure OnFailure, FOnGetCollectiblesWithLowestListingsFirst OnSuccess); UFUNCTION(BlueprintCallable, Category = "0xSequence SDK - Marketplace") void GetAllCollectiblesWithLowestListingsFirst(const FString& ContractAddress, const FSeqCollectiblesFilter& Filter, FOnGetAllCollectiblesWithLowestListingsFirst OnSuccess, FOnFailure OnFailure); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h index d7774759f..f0a6b6ea3 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h @@ -46,17 +46,17 @@ struct FERC1155SaleDetails GENERATED_BODY() UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") - FString Cost; // Use FString or a custom BigInt class + FString Cost; UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") - FString SupplyCap; // Same here + FString SupplyCap; UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") - int64 StartTime; // Use int64 for Unix timestamps + int64 StartTime; UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") int64 EndTime; UPROPERTY(BlueprintReadWrite, Category = "ERC1155 Sale") - FString MerkleRoot; // Represent as hex string + FString MerkleRoot; }; \ No newline at end of file diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp index ee839148d..d65f33ab1 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -19,7 +19,7 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) SaleContract->ContractAddress = TEXT("0xe65b75eb7c58ffc0bf0e671d64d0e1c6cd0d3e5b"); SaleContract->PaymentToken = TEXT("0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"); SaleContract->MaxTotal = 20000; - SaleContract->Data = TEXT("Minted using the Sequence Unity SDK"); + SaleContract->Data = TEXT("Minted using the Sequence Unreal SDK"); FTransakNFTData NFTData; NFTData.ImageURL = TEXT("https://dev-metadata.sequence.app/projects/1010/collections/394/tokens/1/image.png"); @@ -43,7 +43,7 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) TestFalse(TEXT("Failed"), Link.IsEmpty()); - FString ExpectedLink = TEXT("https://global.transak.com/?apiKey=5911d9ec-46b5-48fa-a755-d59a715ff0cf&isNFT=true&calldata=eJzlT0kSwzAI%2BxKrMM9xMHlDn9%2Bk90w742N1kgABoheoQThBD7DpOY7oijjYIXPROmMVbDIE6dVWMeaT%2Fzf0np1l0%2F8Yn7Qss9yk%2BvTWwdzMeamgNapIl5eq5855693%2Fp%2B4tIP5vv6gtJDoMDhMKD7014uKGARdyhQeHXxMN%2FVRulmGRd9fMjs0UX%2FEGjwG76g%3D%3D&contractId=674eb5613d739107bbd18ed2&cryptoCurrencyCode=USDC&estimatedGasLimit=500000&nftData=W3siaW1hZ2VVUkwiOiJodHRwczovL2Rldi1tZXRhZGF0YS5zZXF1ZW5jZS5hcHAvcHJvamVjdHMvMTAxMC9jb2xsZWN0aW9ucy8zOTQvdG9rZW5zLzEvaW1hZ2UucG5nIiwibmZ0TmFtZSI6IktlYXRvbiBULTMyMiIsImNvbGxlY3Rpb25BZGRyZXNzIjoiMHhkZWIzOThmNDFjY2QyOTBlZTUxMTRkZjdlNDk4Y2YwNGZhYzkxNmNiIiwidG9rZW5JRCI6WyIxIl0sInByaWNlIjpbMC4wMl0sInF1YW50aXR5IjoxLCJuZnRUeXBlIjoiRVJDMTE1NSJ9XQ%3D%3D&walletAddress=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07&disableWalletAddressForm=true&partnerOrderId=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07-"); + FString ExpectedLink = TEXT("https://global.transak.com/?apiKey=5911d9ec-46b5-48fa-a755-d59a715ff0cf&isNFT=true&calldata=eJzlj8kRAzEIBFPiHKRwtAjF4PCt9X%2BrXNbT82KA5qAXqEBYoAfZ8N6uqIy42CFj0lwxEzYYgu5ZltHGE%2F%2Bd6gxnOeQf3ydN6z3dJGt5aWMu5r5d0GyZpNNT1fvJeqvT%2B%2FOM3xP%2BmxeziY4Kg8OEwkNvj9ixocGFXOHB4bujoJ%2FMjkK2Z%2BRdN7Pr8I%2Bf9Qb63cD0&contractId=674eb5613d739107bbd18ed2&cryptoCurrencyCode=USDC&estimatedGasLimit=500000&nftData=W3siaW1hZ2VVUkwiOiJodHRwczovL2Rldi1tZXRhZGF0YS5zZXF1ZW5jZS5hcHAvcHJvamVjdHMvMTAxMC9jb2xsZWN0aW9ucy8zOTQvdG9rZW5zLzEvaW1hZ2UucG5nIiwibmZ0TmFtZSI6IktlYXRvbiBULTMyMiIsImNvbGxlY3Rpb25BZGRyZXNzIjoiMHhkZWIzOThmNDFjY2QyOTBlZTUxMTRkZjdlNDk4Y2YwNGZhYzkxNmNiIiwidG9rZW5JRCI6WyIxIl0sInByaWNlIjpbMC4wMl0sInF1YW50aXR5IjoxLCJuZnRUeXBlIjoiRVJDMTE1NSJ9XQ%3D%3D&walletAddress=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07&disableWalletAddressForm=true&partnerOrderId=0xD2eFbb2f18bfE3D265b26D2ACe83400A65335a07-"); TestTrue(TEXT("TransakNFTCheckoutLink starts with expectedLink"), Link.StartsWith(ExpectedLink)); From 2d7e7c0da39b147f61ba5e96f67d9d20363e39cd Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 1 May 2025 08:30:24 -0300 Subject: [PATCH 10/12] removed some comments --- .../Checkout/Transak/TransakCheckout.cpp | 37 +------------------ 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index 93b747f26..442f0318a 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -107,8 +107,6 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO return; } - UE_LOG(LogTemp, Log, TEXT("Building Transak checkout link from collectible order")); - TArray TokenIds = { FString::FromInt(order.TokenMetadata.tokenId) }; TArray Prices = { static_cast(order.Order.PriceUSD) }; @@ -123,11 +121,6 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO ); - UE_LOG(LogTemp, Warning, TEXT("NFT Image: %s"), *NFTData.ImageURL); - UE_LOG(LogTemp, Warning, TEXT("NFT Name: %s"), *NFTData.Name); - UE_LOG(LogTemp, Warning, TEXT("NFT Name: %s"), *NFTData.CollectionAddress); - UE_LOG(LogTemp, Warning, TEXT("NFT Name: %s"), *UEnum::GetValueAsString(NFTData.Type).RightChop(10)); - FTransakContractId TransakContractID = GetTransakContractIdFromCollectibleOrder(order); if (TransakContractID.Id.IsEmpty()) @@ -136,10 +129,7 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO return; } - UE_LOG(LogTemp, Log, TEXT("Using TransakContractID: %s"), *TransakContractID.Id); - USequenceCheckout* Checkout = NewObject< USequenceCheckout>(); - UE_LOG(LogTemp, Log, TEXT("Initialized USequenceCheckout")); Checkout->GenerateBuyTransaction( order.Order.ChainId, @@ -150,43 +140,27 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO EWalletKind::Sequence, [this, NFTData, TransakContractID, OnSuccessCallback](const FGenerateTransactionResponse& Response) - { - UE_LOG(LogTemp, Log, TEXT("Buy transaction generated successfully")); - - - UE_LOG(LogTemp, Log, TEXT("BuyStep Data JSON: %s"), *Response.Steps[0].ExtractBuyStep(Response.Steps).Data); - - + { const FString URL = GetNFTCheckoutLink(NFTData, *Response.Steps[0].ExtractBuyStep(Response.Steps).Data, TransakContractID); - - - UE_LOG(LogTemp, Log, TEXT("Generated Transak Checkout URL: %s"), *URL); - OnSuccessCallback.ExecuteIfBound(URL); }, [OnSuccessCallback](const FSequenceError& Error) { - UE_LOG(LogTemp, Error, TEXT("Failed to generate buy transaction: %s"), *Error.Message); - OnSuccessCallback.ExecuteIfBound(TEXT("Error: Failed to generate transaction")); + OnSuccessCallback.ExecuteIfBound(TEXT("Error: Failed to generate buy transaction")); } ); } FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FSeqCollectibleOrder order) { - UE_LOG(LogTemp, Log, TEXT("Resolving TransakContractId for ChainId: %d, Marketplace: %d"), order.Order.ChainId, static_cast(order.Order.Marketplace)); - FTransakContractId TransakContractID; if (order.Order.ChainId == 137) { - UE_LOG(LogTemp, Log, TEXT("Chain: Polygon")); - switch (order.Order.Marketplace) { case EMarketplaceKind::SEQUENCE_MARKETPLACE_V2: - UE_LOG(LogTemp, Log, TEXT("Marketplace: SEQUENCE_MARKETPLACE_V2")); TransakContractID.Id = TEXT("67ac543448035690a20ac131"); TransakContractID.ContractAddress = TEXT("0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"); @@ -196,7 +170,6 @@ FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FS break; default: - UE_LOG(LogTemp, Log, TEXT("Marketplace: default (likely SEQUENCE_MARKETPLACE_V1 or unknown)")); TransakContractID.Id = TEXT("6675a6d0f597abb8f3e2e9c2"); TransakContractID.ContractAddress = TEXT("0xc2c862322e9c97d6244a3506655da95f05246fd8"); @@ -208,12 +181,9 @@ FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FS } else if (order.Order.ChainId == 42161) { - UE_LOG(LogTemp, Log, TEXT("Chain: Arbitrum")); if (order.Order.Marketplace == EMarketplaceKind::SEQUENCE_MARKETPLACE_V2) { - UE_LOG(LogTemp, Log, TEXT("Marketplace: SEQUENCE_MARKETPLACE_V2")); - TransakContractID.Id = TEXT("66c5a2cf2fb1688e11fcb167"); TransakContractID.ContractAddress = TEXT("0xB537a160472183f2150d42EB1c3DD6684A55f74c"); TransakContractID.Chain = UEnum::GetValueAsString(ENetwork::ArbitrumOne); @@ -221,8 +191,6 @@ FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FS } else if (order.Order.Marketplace == EMarketplaceKind::SEQUENCE_MARKETPLACE_V1) { - UE_LOG(LogTemp, Log, TEXT("Marketplace: SEQUENCE_MARKETPLACE_V1")); - TransakContractID.Id = TEXT("66c5a2d8c00223b9cc6edfdc"); TransakContractID.ContractAddress = TEXT("0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712"); TransakContractID.Chain = UEnum::GetValueAsString(ENetwork::ArbitrumOne); @@ -230,7 +198,6 @@ FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FS } } - UE_LOG(LogTemp, Log, TEXT("Resolved TransakContractId: Id=%s, Address=%s, Chain=%s, TokenSymbol=%s"), *TransakContractID.Id, *TransakContractID.ContractAddress, *TransakContractID.Chain, From aa5a8a8367ccf982c190b543a0555bbcfdae44fa Mon Sep 17 00:00:00 2001 From: caballoninja Date: Mon, 12 May 2025 11:02:25 -0300 Subject: [PATCH 11/12] Fixed data parameter for erc1155 other minor fixes --- .../Checkout/Transak/TransakCheckout.cpp | 26 +++++++++---------- .../Private/Types/ERC1155SaleContract.cpp | 5 ++-- .../Public/Checkout/Transak/TransakCheckout.h | 8 +++--- .../Public/Types/ERC1155SaleContract.h | 9 ++----- .../CheckoutTests/BuildTransakLinksTests.cpp | 6 ++--- 5 files changed, 25 insertions(+), 29 deletions(-) diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp index 442f0318a..34c5ddf3c 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Checkout/Transak/TransakCheckout.cpp @@ -20,8 +20,8 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const if (ContractId.Chain != NetworkString) { - UE_LOG(LogTemp, Error, TEXT("Chain mismatch: ContractId.Chain = %s, Network = %s"), *ContractId.Chain, *NetworkString); - return TEXT("Error: Chain mismatch. Transak Checkout object network must match the TransakContractId chain."); + FString ChainMismatchError = FString::Printf(TEXT("Chain mismatch: ContractId.Chain = %s, Network = %s"), *ContractId.Chain, *NetworkString); + return ChainMismatchError; } const FString TransakCallData = FCallDataCompressor::Compress(CallData); @@ -63,7 +63,7 @@ FString UTransakCheckout::GetNFTCheckoutLink(const FTransakNFTData& Item, const } -FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Data, const TArray& Proof) +FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, const TArray& Proof, const FString& Data) { if (!SaleContract) @@ -91,7 +91,8 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* TransakContractAddresses[Network], TokenIds, Amounts, - Proof + Proof, + Data ); FString callData = result.data; @@ -99,7 +100,7 @@ FString UTransakCheckout::BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* return GetNFTCheckoutLink(TransakNFTData, callData, ContractId); } -void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder order, int64 quantity, ENFTType type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback) +void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder order, int64 quantity, ENFTType type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback, FOnTransakCheckoutFailure OnFailureCallback) { if (quantity <= 0) { @@ -107,8 +108,12 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO return; } + double PriceAmount = FCString::Atod(*order.Order.PriceAmount); + double PriceDecimals = static_cast(order.Order.PriceDecimals); + float NormalizedPrice = static_cast(PriceAmount / FMath::Pow(10.0, PriceDecimals)); + TArray Prices = { NormalizedPrice }; + TArray TokenIds = { FString::FromInt(order.TokenMetadata.tokenId) }; - TArray Prices = { static_cast(order.Order.PriceUSD) }; FTransakNFTData NFTData( order.TokenMetadata.image, @@ -145,9 +150,9 @@ void UTransakCheckout::BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleO OnSuccessCallback.ExecuteIfBound(URL); }, - [OnSuccessCallback](const FSequenceError& Error) + [OnFailureCallback](const FSequenceError& Error) { - OnSuccessCallback.ExecuteIfBound(TEXT("Error: Failed to generate buy transaction")); + OnFailureCallback.ExecuteIfBound(TEXT("Error: Failed to generate buy transaction")); } ); } @@ -198,11 +203,6 @@ FTransakContractId UTransakCheckout::GetTransakContractIdFromCollectibleOrder(FS } } - *TransakContractID.Id, - *TransakContractID.ContractAddress, - *TransakContractID.Chain, - *TransakContractID.PriceTokenSymbol); - return TransakContractID; } diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp index 6618d7e25..8ca7c9e95 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Private/Types/ERC1155SaleContract.cpp @@ -6,15 +6,14 @@ UERC1155SaleContract::UERC1155SaleContract() { } -UERC1155SaleContract::UERC1155SaleContract(FString ContractAddress, FString PaymentToken, int32 MaxTotal, FString Data) +UERC1155SaleContract::UERC1155SaleContract(FString ContractAddress, FString PaymentToken, int32 MaxTotal) { 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) +FRawTransaction UERC1155SaleContract::MakePurchaseTransaction(const FString& ToAddress, const TArray& TokenIds, const TArray& Amounts, const TArray& Proof, const FString Data) { FString FunctionSignature = "mint(address,uint256[],uint256[],bytes,address,uint256,bytes32[])"; diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h index 159640758..eff107886 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Checkout/Transak/TransakCheckout.h @@ -14,6 +14,8 @@ #include "TransakCheckout.generated.h" DECLARE_DYNAMIC_DELEGATE_OneParam(FOnTransakCheckoutGenerated, const FString&, CheckoutURL); +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnTransakCheckoutFailure, const FString&, Error); + UCLASS(Blueprintable) class SEQUENCEPLUGIN_API UTransakCheckout : public UObject @@ -39,11 +41,11 @@ class SEQUENCEPLUGIN_API UTransakCheckout : public UObject UFUNCTION(BlueprintCallable, Category = "Transak") FString BuildNFTCheckoutLinkFromERC1155(UERC1155SaleContract* SaleContract, const FTransakNFTData TransakNFTData, const FTransakContractId& ContractId, - const TArray& Data, - const TArray& Proof); + const TArray& Proof, + const FString& Data); UFUNCTION(BlueprintCallable, Category = "Transak") - void BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder Order, int64 Quantity, ENFTType Type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback); + void BuildNFTCheckoutLinkFromCollectibleOrder(FSeqCollectibleOrder Order, int64 Quantity, ENFTType Type, FAdditionalFee AdditionalFee, FOnTransakCheckoutGenerated OnSuccessCallback, FOnTransakCheckoutFailure OnFailureCallback); UFUNCTION(BlueprintCallable, Category = "Transak") FTransakContractId GetTransakContractIdFromCollectibleOrder(FSeqCollectibleOrder order); diff --git a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h index d020a1e99..dbcb0748b 100644 --- a/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h +++ b/Plugins/SequencePlugin/Source/SequencePlugin/Public/Types/ERC1155SaleContract.h @@ -14,7 +14,7 @@ class SEQUENCEPLUGIN_API UERC1155SaleContract : public UObject public: UERC1155SaleContract(); - UERC1155SaleContract(FString ContractAddress, FString PaymentToken, int32 MaxTotal, FString Data); + UERC1155SaleContract(FString ContractAddress, FString PaymentToken, int32 MaxTotal); UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn = true), Category = "0xSequence - ERC1155 Sale") FString ContractAddress; @@ -25,19 +25,14 @@ class SEQUENCEPLUGIN_API UERC1155SaleContract : public UObject UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn = true), Category = "0xSequence - ERC1155 Sale") int32 MaxTotal; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn = true), Category = "0xSequence - ERC1155 Sale") - FString Data; - UFUNCTION(BlueprintCallable, Category = "0xSequence - ERC1155 Sale") - FRawTransaction MakePurchaseTransaction(const FString& ToAddress, const TArray& TokenIds, const TArray& Amounts, const TArray& Proof); + FRawTransaction MakePurchaseTransaction(const FString& ToAddress, const TArray& TokenIds, const TArray& Amounts, const TArray& Proof, const FString Data); FContractCall GetPaymentToken(); FContractCall GetGlobalSaleDetails(); - //FString Abi = "[{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkMerkleProof\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMember\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMemberCount\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalSaleDetails\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"items\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expectedPaymentToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxTotal\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"paymentToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalSaleDetails\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPaymentToken\",\"inputs\":[{\"name\":\"paymentTokenAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenSaleDetails\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct IERC1155SaleFunctions.SaleDetails\",\"components\":[{\"name\":\"cost\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawETH\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GlobalSaleDetailsUpdated\",\"inputs\":[{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSaleDetailsUpdated\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"cost\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"supplyCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"GlobalSaleInactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientPayment\",\"inputs\":[{\"name\":\"currency\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientSupply\",\"inputs\":[{\"name\":\"currentSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSaleDetails\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenIds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MerkleProofInvalid\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SaleInactive\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawFailed\",\"inputs\":[]}]"; - }; USTRUCT(BlueprintType) diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp index d65f33ab1..4b06ed650 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/CheckoutTests/BuildTransakLinksTests.cpp @@ -19,7 +19,6 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) SaleContract->ContractAddress = TEXT("0xe65b75eb7c58ffc0bf0e671d64d0e1c6cd0d3e5b"); SaleContract->PaymentToken = TEXT("0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"); SaleContract->MaxTotal = 20000; - SaleContract->Data = TEXT("Minted using the Sequence Unreal SDK"); FTransakNFTData NFTData; NFTData.ImageURL = TEXT("https://dev-metadata.sequence.app/projects/1010/collections/394/tokens/1/image.png"); @@ -36,10 +35,11 @@ bool FTransakCheckoutLinkPrimarySaleTest::RunTest(const FString& Parameters) ContractId.Chain = UEnum::GetValueAsString(ENetwork::PolygonChain); ContractId.PriceTokenSymbol = "USDC"; - TArray data; + FString data = TEXT("Minted using the Sequence Unreal SDK"); + TArray proof; - FString Link = Checkout->BuildNFTCheckoutLinkFromERC1155(SaleContract, NFTData, ContractId, data, proof); + FString Link = Checkout->BuildNFTCheckoutLinkFromERC1155(SaleContract, NFTData, ContractId, proof, data); TestFalse(TEXT("Failed"), Link.IsEmpty()); From 1e5b8c15cf16d926d14df8849b5e1464b6c97ab0 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Mon, 12 May 2025 11:16:46 -0300 Subject: [PATCH 12/12] update erc1155 test to match new struct fields --- .../Private/TokenWrapperTests/ERC1155SaleTests.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Plugins/SequenceTests/Source/SequenceTests/Private/TokenWrapperTests/ERC1155SaleTests.cpp b/Plugins/SequenceTests/Source/SequenceTests/Private/TokenWrapperTests/ERC1155SaleTests.cpp index c875ceb35..6d98af716 100644 --- a/Plugins/SequenceTests/Source/SequenceTests/Private/TokenWrapperTests/ERC1155SaleTests.cpp +++ b/Plugins/SequenceTests/Source/SequenceTests/Private/TokenWrapperTests/ERC1155SaleTests.cpp @@ -8,15 +8,13 @@ bool FTokenWrapper_ERC1155Sale_Create::RunTest(const FString& Parameters) const FString TestAddress = "0x1234567890123456789012345678901234567890"; const FString TestPaymentToken = "0x0987654321098765432109876543210987654321"; const int32 TestMaxTotal = 1000; - const FString TestData = "test_data"; - UERC1155SaleContract* Contract = UERC1155SaleContract::Create(TestAddress, TestPaymentToken, TestMaxTotal, TestData); + UERC1155SaleContract* Contract = UERC1155SaleContract::Create(TestAddress, TestPaymentToken, TestMaxTotal); TestNotNull("Contract should not be null", Contract); TestEqual("Contract address should match", Contract->ContractAddress, TestAddress); TestEqual("Payment token should match", Contract->PaymentToken, TestPaymentToken); TestEqual("Max total should match", Contract->MaxTotal, TestMaxTotal); - TestEqual("Data should match", Contract->Data, TestData); return true; } \ No newline at end of file