Skip to content

Commit 570d0a4

Browse files
authored
feat: added zk evm sign typed data method (#146)
* feat: added zk evm sign typed data method * feat: added blueprint sample for sign typed data method
1 parent cbe489c commit 570d0a4

File tree

7 files changed

+104
-1
lines changed

7 files changed

+104
-1
lines changed
Binary file not shown.
Binary file not shown.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include "Immutable/Actions/ImtblPassportZkEvmSignTypedDataV4AsyncAction.h"
2+
3+
#include "Immutable/ImmutablePassport.h"
4+
#include "Immutable/ImmutableSubsystem.h"
5+
#include "Immutable/Misc/ImtblLogging.h"
6+
7+
8+
UImtblPassportZkEvmSignTypedDataV4AsyncAction* UImtblPassportZkEvmSignTypedDataV4AsyncAction::ZkEvmSignTypedDataV4(UObject* WorldContextObject, const FString& JsonStringRequest)
9+
{
10+
UImtblPassportZkEvmSignTypedDataV4AsyncAction* PassportZkEvmSignTypedDataV4BlueprintNode = NewObject<UImtblPassportZkEvmSignTypedDataV4AsyncAction>();
11+
12+
PassportZkEvmSignTypedDataV4BlueprintNode->WorldContextObject = WorldContextObject;
13+
PassportZkEvmSignTypedDataV4BlueprintNode->JsonStringSignRequest = JsonStringRequest;
14+
15+
return PassportZkEvmSignTypedDataV4BlueprintNode;
16+
}
17+
18+
void UImtblPassportZkEvmSignTypedDataV4AsyncAction::Activate()
19+
{
20+
if (!WorldContextObject || !WorldContextObject->GetWorld())
21+
{
22+
FString Err = "zkEVM Sign Typed Data V4 failed due to missing world or world " "context object.";
23+
IMTBL_WARN("%s", *Err)
24+
Failed.Broadcast(Err, TEXT(""));
25+
return;
26+
}
27+
28+
GetSubsystem()->WhenReady(this, &UImtblPassportZkEvmSignTypedDataV4AsyncAction::DoZkEvmSignTypedDataV4);
29+
}
30+
31+
void UImtblPassportZkEvmSignTypedDataV4AsyncAction::DoZkEvmSignTypedDataV4(TWeakObjectPtr<UImtblJSConnector> JSConnector)
32+
{
33+
auto Passport = GetSubsystem()->GetPassport();
34+
35+
if (Passport.IsValid())
36+
{
37+
Passport->ZkEvmSignTypedDataV4(JsonStringSignRequest, UImmutablePassport::FImtblPassportResponseDelegate::CreateUObject(this, &UImtblPassportZkEvmSignTypedDataV4AsyncAction::OnZkEvmSignTypedDataV4Response));
38+
}
39+
}
40+
41+
void UImtblPassportZkEvmSignTypedDataV4AsyncAction::OnZkEvmSignTypedDataV4Response(FImmutablePassportResult Result)
42+
{
43+
if (Result.Success)
44+
{
45+
IMTBL_LOG("zkEVM Sign Typed Data V4 success")
46+
MessageSigned.Broadcast(TEXT(""), UImmutablePassport::GetResponseResultAsString(Result.Response));
47+
}
48+
else
49+
{
50+
IMTBL_LOG("zkEVM Sign Typed Data V4 failed")
51+
Failed.Broadcast(Result.Error, TEXT(""));
52+
}
53+
}

Source/Immutable/Private/Immutable/ImmutablePassport.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ void UImmutablePassport::ZkEvmGetTransactionReceipt(const FZkEvmTransactionRecei
130130
CallJS(ImmutablePassportAction::ZkEvmGetTransactionReceipt, UStructToJsonString(Request), ResponseDelegate, FImtblJSResponseDelegate::CreateUObject(this, &UImmutablePassport::OnBridgeCallbackResponse));
131131
}
132132

133+
void UImmutablePassport::ZkEvmSignTypedDataV4(const FString& RequestJsonString, const FImtblPassportResponseDelegate& ResponseDelegate)
134+
{
135+
CallJS(ImmutablePassportAction::ZkEvmSignTypedDataV4, RequestJsonString, ResponseDelegate, FImtblJSResponseDelegate::CreateUObject(this, &UImmutablePassport::OnBridgeCallbackResponse));
136+
}
137+
133138
void UImmutablePassport::ConfirmCode(const FString& DeviceCode, const float Interval, const FImtblPassportResponseDelegate& ResponseDelegate)
134139
{
135140
FImmutablePassportCodeConfirmRequestData Data{DeviceCode, Interval};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#pragma once
2+
3+
4+
#include "Immutable/ImmutablePassport.h"
5+
#include "ImtblBlueprintAsyncAction.h"
6+
7+
#include "ImtblPassportZkEvmSignTypedDataV4AsyncAction.generated.h"
8+
9+
/**
10+
* Async action blueprint node for zkEVM SignTypedDataV4
11+
*/
12+
UCLASS()
13+
class IMMUTABLE_API UImtblPassportZkEvmSignTypedDataV4AsyncAction : public UImtblBlueprintAsyncAction
14+
{
15+
GENERATED_BODY()
16+
17+
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FPassportZkEvmSignTypedDataV4OutputPin, FString, ErrorMessage, FString, Signature);
18+
19+
public:
20+
UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject", BlueprintInternalUseOnly = "true"), Category = "Immutable")
21+
static UImtblPassportZkEvmSignTypedDataV4AsyncAction* ZkEvmSignTypedDataV4(UObject* WorldContextObject, const FString& JsonStringRequest);
22+
23+
virtual void Activate() override;
24+
25+
private:
26+
FString JsonStringSignRequest;
27+
28+
UPROPERTY(BlueprintAssignable)
29+
FPassportZkEvmSignTypedDataV4OutputPin MessageSigned;
30+
UPROPERTY(BlueprintAssignable)
31+
FPassportZkEvmSignTypedDataV4OutputPin Failed;
32+
33+
void DoZkEvmSignTypedDataV4(TWeakObjectPtr<class UImtblJSConnector> JSGetConnector);
34+
void OnZkEvmSignTypedDataV4Response(FImmutablePassportResult Result);
35+
};

Source/Immutable/Public/Immutable/ImmutableNames.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace ImmutablePassportAction
1616
const FString ZkEvmSendTransaction = TEXT("zkEvmSendTransaction");
1717
const FString zkEvmSendTransactionWithConfirmation = TEXT("zkEvmSendTransactionWithConfirmation");
1818
const FString ZkEvmGetTransactionReceipt = TEXT("zkEvmGetTransactionReceipt");
19+
const FString ZkEvmSignTypedDataV4 = TEXT("zkEvmSignTypedDataV4");
1920

2021
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
2122
const FString GetPKCEAuthUrl = TEXT("getPKCEAuthUrl");

Source/Immutable/Public/Immutable/ImmutablePassport.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
#include "CoreMinimal.h"
66
#include "JsonObjectConverter.h"
7-
#include "Misc/EngineVersion.h"
87
#include "Runtime/Core/Public/HAL/Platform.h"
98
#include "UObject/Object.h"
109
#include "Immutable/ImtblJSConnector.h"
@@ -164,6 +163,16 @@ class IMMUTABLE_API UImmutablePassport : public UObject
164163
* FImtblPassportResponseDelegate to call on response from JS.
165164
*/
166165
void ZkEvmGetTransactionReceipt(const FZkEvmTransactionReceiptRequest& Request, const FImtblPassportResponseDelegate& ResponseDelegate);
166+
167+
/**
168+
* Generate a signature for a typed data V4 object
169+
* Signs the EIP-712 structured message in JSON string format using the logged-in Passport account.
170+
* @see https://eips.ethereum.org/EIPS/eip-712
171+
* @param RequestJsonString The EIP-712 structured data in JSON string format
172+
* @param ResponseDelegate The response delegate of type
173+
* FImtblPassportResponseDelegate to call on response from JS.
174+
*/
175+
void ZkEvmSignTypedDataV4(const FString& RequestJsonString, const FImtblPassportResponseDelegate& ResponseDelegate);
167176

168177
/**
169178
* Gets the currently saved ID token without verifying its validity.

0 commit comments

Comments
 (0)