Pt 166696064 decode calldata fate #168
@ -71,7 +71,7 @@ prop_opcodes() ->
|
|||||||
|
|
||||||
|
|
||||||
valid_opcodes() ->
|
valid_opcodes() ->
|
||||||
lists:seq(0, 16#72) ++ lists:seq(16#fa, 16#fd).
|
lists:seq(0, 16#75) ++ lists:seq(16#fa, 16#fd).
|
||||||
|
|
||||||
|
|
||||||
fate_code(Failure) ->
|
fate_code(Failure) ->
|
||||||
|
@ -112,6 +112,7 @@ fate_data(0, _Options) ->
|
|||||||
fate_signature(),
|
fate_signature(),
|
||||||
fate_contract(),
|
fate_contract(),
|
||||||
fate_oracle(),
|
fate_oracle(),
|
||||||
|
fate_oracle_q(),
|
||||||
fate_name(),
|
fate_name(),
|
||||||
fate_bits(),
|
fate_bits(),
|
||||||
fate_channel()]));
|
fate_channel()]));
|
||||||
@ -142,6 +143,7 @@ fate_hash() -> {call, aeb_fate_data, make_hash, [non_zero_binary(32)]}.
|
|||||||
fate_signature() -> {call, aeb_fate_data, make_signature, [non_zero_binary(64)]}.
|
fate_signature() -> {call, aeb_fate_data, make_signature, [non_zero_binary(64)]}.
|
||||||
fate_contract() -> {call, aeb_fate_data, make_contract, [non_zero_binary(256 div 8)]}.
|
fate_contract() -> {call, aeb_fate_data, make_contract, [non_zero_binary(256 div 8)]}.
|
||||||
fate_oracle() -> {call, aeb_fate_data, make_oracle, [non_zero_binary(256 div 8)]}.
|
fate_oracle() -> {call, aeb_fate_data, make_oracle, [non_zero_binary(256 div 8)]}.
|
||||||
|
fate_oracle_q() -> {call, aeb_fate_data, make_oracle_query, [non_zero_binary(256 div 8)]}.
|
||||||
fate_name() -> {call, aeb_fate_data, make_name, [non_zero_binary(256 div 8)]}.
|
fate_name() -> {call, aeb_fate_data, make_name, [non_zero_binary(256 div 8)]}.
|
||||||
fate_channel() -> {call, aeb_fate_data, make_channel, [non_zero_binary(256 div 8)]}.
|
fate_channel() -> {call, aeb_fate_data, make_channel, [non_zero_binary(256 div 8)]}.
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ create_calldata(FunName, Args, ArgTypes0, RetType) ->
|
|||||||
<<TypeHashInt:?HASH_SIZE/unit:8>> =
|
<<TypeHashInt:?HASH_SIZE/unit:8>> =
|
||||||
function_type_hash(list_to_binary(FunName), ArgTypes, RetType),
|
function_type_hash(list_to_binary(FunName), ArgTypes, RetType),
|
||||||
Data = aeb_heap:to_binary({TypeHashInt, list_to_tuple(Args)}),
|
Data = aeb_heap:to_binary({TypeHashInt, list_to_tuple(Args)}),
|
||||||
{ok, Data, {tuple, [word, ArgTypes]}, RetType}.
|
{ok, Data}.
|
||||||
|
|
||||||
-spec check_calldata(binary(), type_info()) ->
|
-spec check_calldata(binary(), type_info()) ->
|
||||||
{'ok', typerep(), typerep()} | {'error', atom()}.
|
{'ok', typerep(), typerep()} | {'error', atom()}.
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
-module(aeb_fate_abi).
|
-module(aeb_fate_abi).
|
||||||
|
|
||||||
-export([ create_calldata/2
|
-export([ create_calldata/2
|
||||||
|
, decode_calldata/2
|
||||||
, get_function_hash_from_calldata/1
|
, get_function_hash_from_calldata/1
|
||||||
, get_function_name_from_function_hash/2
|
, get_function_name_from_function_hash/2
|
||||||
, get_function_type_from_function_hash/2 ]).
|
, get_function_type_from_function_hash/2 ]).
|
||||||
@ -27,6 +28,14 @@ create_calldata(FunName, Args) ->
|
|||||||
aeb_fate_data:make_tuple({FunctionId,
|
aeb_fate_data:make_tuple({FunctionId,
|
||||||
aeb_fate_data:make_tuple(list_to_tuple(Args))}))}.
|
aeb_fate_data:make_tuple(list_to_tuple(Args))}))}.
|
||||||
|
|
||||||
|
-spec decode_calldata(list(), binary()) -> {ok, term()} | {error, term()}.
|
||||||
|
decode_calldata(FunName, Calldata) ->
|
||||||
|
FunctionId = aeb_fate_code:symbol_identifier(list_to_binary(FunName)),
|
||||||
|
case ?FATE_TUPLE_ELEMENTS(aeb_fate_encoding:deserialize(Calldata)) of
|
||||||
|
[FunctionId, FateArgs] -> {ok, ?FATE_TUPLE_ELEMENTS(FateArgs)};
|
||||||
|
_ -> {error, decode_error}
|
||||||
|
end.
|
||||||
|
|
||||||
-spec get_function_name_from_function_hash(binary(), aeb_fate_code:fcode()) ->
|
-spec get_function_name_from_function_hash(binary(), aeb_fate_code:fcode()) ->
|
||||||
{ok, term()} | {error, term()}.
|
{ok, term()} | {error, term()}.
|
||||||
get_function_name_from_function_hash(<<SymbolHash:4/binary, _:28/binary>>, FateCode) ->
|
get_function_name_from_function_hash(<<SymbolHash:4/binary, _:28/binary>>, FateCode) ->
|
||||||
|
@ -373,6 +373,7 @@ deserialize2(<<?POS_BITS, Rest/binary>>) ->
|
|||||||
{?FATE_BITS(Bint), Rest2};
|
{?FATE_BITS(Bint), Rest2};
|
||||||
deserialize2(<<?LONG_STRING, Rest/binary>>) ->
|
deserialize2(<<?LONG_STRING, Rest/binary>>) ->
|
||||||
{S, Rest2} = deserialize_one(Rest),
|
{S, Rest2} = deserialize_one(Rest),
|
||||||
|
true = is_integer(S) andalso S >= 0,
|
||||||
Size = S + ?SHORT_STRING_SIZE,
|
Size = S + ?SHORT_STRING_SIZE,
|
||||||
String = binary:part(Rest2, 0, Size),
|
String = binary:part(Rest2, 0, Size),
|
||||||
Rest3 = binary:part(Rest2, byte_size(Rest2), - (byte_size(Rest2) - Size)),
|
Rest3 = binary:part(Rest2, byte_size(Rest2), - (byte_size(Rest2) - Size)),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user