Nightly versions may be unstable or not compatible across tooling.
Hash based ids are deterministically generated from associated types and are used in the JSON ABI for type
IDs and for logId
.
This document specifies how the hash based IDS are generated for type
IDs and for logId
.
Hash based ids for type
IDs are generated from the sha256
of a string that represents the type.
For logIds
we use the first 8 bytes of the sha256
of a string that represents the type, this is because the LOG
and LOGD
opcodes use a 64bit value as log id.
For describing the string representation of type we will use the notation {abi_str(T)}
that should be replaced by the respective ABI string representation of the respective type T
.
u8
=> "u8"
u16
=> "u16"
u32
=> "u32"
u64
=> "u64"
u256
=> "u256"
b256
=> "b256"
bool
=> "bool"
String array of size 1
=> "str[1]"
String array of size 2
=> "str[2]"
etc.
String slice => "str"
[T; 1]
=> "[{abi_str(T)}; 1]"
[T; 2]
=> "[{abi_str(T)}; 2]"
etc.
()
=> "()"
(T1)
=> "({abi_str(T1)})"
(T1,T2)
=> "({abi_str(T1)}, {abi_str(T2)})"
etc.
Option
enum with type parameter T
=> "enum std::option::Option<{abi_str(T)}>"
Enum without type parameters named MyEnum
=> "enum MyEnum"
Enum with type parameter T1
named MyEnum
=> "enum MyEnum<{abi_str(T1)}>"
Enum with type parameters T1
, T2
named MyEnum
in my_module
=> "enum my_module::MyEnum<{abi_str(T1)},{abi_str(T2)}>"
Vec
struct with type parameter T
=> "struct std::vec::Vec<{abi_str(T)}>"
Struct without type parameters named MyStruct
=> "struct MyStruct"
Struct with type parameter T1
named MyStruct
=> "struct MyStruct<{abi_str(T1)}>"
Struct with type parameters T1
, T2
named MyStruct
in my_module
=> "struct my_module::MyStruct<{abi_str(T1)},{abi_str(T2)}>"
Generic type parameter T
if root type => "generic T"
Generic type parameter T
if not root type => "T"
as in "struct MyStruct<T>"
Tuple of array and u64
=> "([u64,1]; u64)"
Array of Option<u64>
=> "[enum std::option::Option<u64>; 3]"
Struct with tuple type parameter => "struct my_module::MyStruct<(u64, u64)>"