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"
66#include " Types/BinaryData.h"
77
88TFixedABIData ABI::UInt32 (uint32 Input)
99{
1010 TArray<uint8> Arr;
11- ABIEncodeable ::PushEmptyBlock (Arr);
12- ABIEncodeable ::CopyInUInt32 (Arr, Input, 0 );
11+ ABIElement ::PushEmptyBlock (Arr);
12+ ABIElement ::CopyInUInt32 (Arr, Input, 0 );
1313 return TFixedABIData (Arr);
1414}
1515
1616TFixedABIData ABI::Int32 (int32 Input)
1717{
1818 TArray<uint8> Arr;
19- ABIEncodeable ::PushEmptyBlock (Arr);
20- ABIEncodeable ::CopyInInt32 (Arr, Input, 0 );
19+ ABIElement ::PushEmptyBlock (Arr);
20+ ABIElement ::CopyInInt32 (Arr, Input, 0 );
2121 return TFixedABIData (Arr);
2222}
2323
2424TFixedABIData ABI::Bool (bool Input)
2525{
2626 TArray<uint8> Arr;
27- ABIEncodeable::PushEmptyBlock (Arr);
28- if (Input)
29- {
30- Arr[GBlockByteLength - 1 ] = 0x00 ;
31- }
27+ ABIElement::PushEmptyBlock (Arr);
28+ Arr[GBlockByteLength - 1 ] = Input ? 0x01 : 0x00 ;
3229 return TFixedABIData (Arr);
3330}
3431
@@ -51,22 +48,70 @@ TDynamicABIData ABI::String(FString Input)
5148 return TDynamicABIData (Arr);
5249}
5350
54- FUnsizedData ABI::Encode (FString Signature, TArray<ABIEncodeable*> Arr)
51+
52+ // DEPRECATED
53+ FUnsizedData ABI::Encode (FString Signature, TArray<ABIElement*> Args)
54+ {
55+ TArray<TSharedPtr<ABIElement>> NewArgs;
56+ for (auto i = 0 ; i < Args.Num (); i++)
57+ {
58+ NewArgs.Push (Args[i]->Clone ());
59+ }
60+
61+ TOptional<FUnsizedData> Encoded = Encode (Signature, NewArgs);
62+
63+ if (Encoded.IsSet ())
64+ {
65+ return Encoded.GetValue ();
66+ }
67+ else
68+ {
69+ return FUnsizedData { TArray<uint8>() };
70+ }
71+ }
72+
73+ TOptional<FUnsizedData> ABI::Encode (FString Signature, TArray<TSharedPtr<ABIElement>> Args)
5574{
56- TFixedABIArray FixedArr (Arr);
75+ if (!IsValidSignature (Signature))
76+ {
77+ UE_LOG (LogTemp, Display, TEXT (" Invalid signature! Remember that ABI signatures should only contain argument types without spaces and NOT names." ));
78+ return TOptional<FUnsizedData>();
79+ }
80+
81+ TFixedABIArray FixedArr (Args);
5782 FUnsizedData Data {
5883 FixedArr.Encode ()
5984 };
6085 FUnsizedData SignatureData = StringToUTF8 (Signature);
6186 FHash256 Hash = GetKeccakHash (SignatureData);
62- Data.Arr ->Insert (Hash.Ptr (), 4 , 0 );
87+ Data.Arr ->Insert (Hash.Ptr (), GSignatureLength , 0 );
6388 return Data;
6489}
6590
66- FString ABI::Display (FString Signature, TArray<ABIEncodeable*> Arr)
91+ void ABI::Decode (TArray<uint8> Data, TArray<TSharedPtr<ABIElement>> Args)
92+ {
93+ TFixedABIArray FixedArr (Args);
94+ FixedArr.Decode (Data, GSignatureLength, GSignatureLength);
95+ }
96+
97+ bool ABI::IsValidSignature (FString Signature)
98+ {
99+ const FRegexPattern FunctionABIRegex (TEXT (" ^[A-Z|a-z|,-|0-9]+(([A-Z|a-z|0-9]+(, [A-Z|a-z|0-9]+))?)$" ));
100+ FRegexMatcher MyMatcher (FunctionABIRegex, Signature);
101+ return MyMatcher.FindNext ();
102+ }
103+
104+ FString ABI::Display (FString Signature, TArray<TSharedPtr<ABIElement>> Args)
67105{
68106 FString Str = " " ;
69- FString Reference = Encode (Signature, Arr).ToHex ();
107+ TOptional<FUnsizedData> Encoded = Encode (Signature, Args);
108+
109+ if (!Encoded.IsSet ())
110+ {
111+ return " Signature not valid!" ;
112+ }
113+
114+ FString Reference = Encoded.GetValue ().ToHex ();
70115
71116 for (int i = 0 ; i < Reference.Len (); i++)
72117 {
0 commit comments