11// Copyright 2024 Horizon Blockchain Games Inc. All rights reserved.
22
33#include " ABI/ABI.h"
4- #include " ABI/ABIEncodeable .h"
4+ #include " ABI/ABIElement .h"
55#include " Eth/Crypto.h"
6+ #include " Internationalization/Regex.h"
67#include " Types/BinaryData.h"
78
89TFixedABIData ABI::UInt32 (uint32 Input)
910{
1011 TArray<uint8> Arr;
11- ABIEncodeable ::PushEmptyBlock (Arr);
12- ABIEncodeable ::CopyInUInt32 (Arr, Input, 0 );
12+ ABIElement ::PushEmptyBlock (Arr);
13+ ABIElement ::CopyInUInt32 (Arr, Input, 0 );
1314 return TFixedABIData (Arr);
1415}
1516
1617TFixedABIData ABI::Int32 (int32 Input)
1718{
1819 TArray<uint8> Arr;
19- ABIEncodeable ::PushEmptyBlock (Arr);
20- ABIEncodeable ::CopyInInt32 (Arr, Input, 0 );
20+ ABIElement ::PushEmptyBlock (Arr);
21+ ABIElement ::CopyInInt32 (Arr, Input, 0 );
2122 return TFixedABIData (Arr);
2223}
2324
2425TFixedABIData ABI::Bool (bool Input)
2526{
2627 TArray<uint8> Arr;
27- ABIEncodeable::PushEmptyBlock (Arr);
28- if (Input)
29- {
30- Arr[GBlockByteLength - 1 ] = 0x00 ;
31- }
28+ ABIElement::PushEmptyBlock (Arr);
29+ Arr[GBlockByteLength - 1 ] = Input ? 0x01 : 0x00 ;
3230 return TFixedABIData (Arr);
3331}
3432
@@ -51,22 +49,70 @@ TDynamicABIData ABI::String(FString Input)
5149 return TDynamicABIData (Arr);
5250}
5351
54- FUnsizedData ABI::Encode (FString Signature, TArray<ABIEncodeable*> Arr)
52+
53+ // DEPRECATED
54+ FUnsizedData ABI::Encode (FString Signature, TArray<ABIElement*> Args)
55+ {
56+ TArray<TSharedPtr<ABIElement>> NewArgs;
57+ for (auto i = 0 ; i < Args.Num (); i++)
58+ {
59+ NewArgs.Push (Args[i]->Clone ());
60+ }
61+
62+ TOptional<FUnsizedData> Encoded = Encode (Signature, NewArgs);
63+
64+ if (Encoded.IsSet ())
65+ {
66+ return Encoded.GetValue ();
67+ }
68+ else
69+ {
70+ return FUnsizedData { TArray<uint8>() };
71+ }
72+ }
73+
74+ TOptional<FUnsizedData> ABI::Encode (FString Signature, TArray<TSharedPtr<ABIElement>> Args)
5575{
56- TFixedABIArray FixedArr (Arr);
76+ if (!IsValidSignature (Signature))
77+ {
78+ UE_LOG (LogTemp, Display, TEXT (" Invalid signature! Remember that ABI signatures should only contain argument types without spaces and NOT names." ));
79+ return TOptional<FUnsizedData>();
80+ }
81+
82+ TFixedABIArray FixedArr (Args);
5783 FUnsizedData Data {
5884 FixedArr.Encode ()
5985 };
6086 FUnsizedData SignatureData = StringToUTF8 (Signature);
6187 FHash256 Hash = GetKeccakHash (SignatureData);
62- Data.Arr ->Insert (Hash.Ptr (), 4 , 0 );
88+ Data.Arr ->Insert (Hash.Ptr (), GSignatureLength , 0 );
6389 return Data;
6490}
6591
66- FString ABI::Display (FString Signature, TArray<ABIEncodeable*> Arr)
92+ void ABI::Decode (TArray<uint8> Data, TArray<TSharedPtr<ABIElement>> Args)
93+ {
94+ TFixedABIArray FixedArr (Args);
95+ FixedArr.Decode (Data, GSignatureLength, GSignatureLength);
96+ }
97+
98+ bool ABI::IsValidSignature (FString Signature)
99+ {
100+ const FRegexPattern FunctionABIRegex (TEXT (" ^[A-Z|a-z|,-|0-9]+(([A-Z|a-z|0-9]+(, [A-Z|a-z|0-9]+))?)$" ));
101+ FRegexMatcher MyMatcher (FunctionABIRegex, Signature);
102+ return MyMatcher.FindNext ();
103+ }
104+
105+ FString ABI::Display (FString Signature, TArray<TSharedPtr<ABIElement>> Args)
67106{
68107 FString Str = " " ;
69- FString Reference = Encode (Signature, Arr).ToHex ();
108+ TOptional<FUnsizedData> Encoded = Encode (Signature, Args);
109+
110+ if (!Encoded.IsSet ())
111+ {
112+ return " Signature not valid!" ;
113+ }
114+
115+ FString Reference = Encoded.GetValue ().ToHex ();
70116
71117 for (int i = 0 ; i < Reference.Len (); i++)
72118 {
0 commit comments