Addresses on the network can either be a wallet or a contract. Addresses come in two format Bech32 or Base16. Bech32's start with the prefix
zil1... whereas Base16's are prefixed with
Converting a Bech32 into a Base16 and vice versa can be achieved manually though our Neo-Savant IDE
(Tools>AddressConverter) or programmatically using programs like zilliqa-js. When we refer to a ByStr20 address in Scilla, we refer to the Base16 address.
Bech32 = zil1zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3h6785sBase16 = 0x1111111111111111111111111111111111111111
let constant_bystr = 0x1111111111111111111111111111111111111111
contract Example( immutable_bystr: ByStr20)
field addr_bystr : ByStr20 = constant_bystr
We can infer subtypes of Address such as 'A contract on the network' or 'A user or contract on the network' to give some type safety when trying to use contracts or addresses that might not exist
(* any valid bytes of string length 20, not guaranteed to be valid *) ByStr20 (* guarantees to be either a contract or a user with some balance or nonce >= 1*) ByStr20 with end (* guarantees to be a contract *) ByStr20 with contract end
Read more on Address subtyping here.