Hashmaps

There are Hashmaps and HashmapAugs implementations.

Hashmap

Serialization

To create one provide in HashMap constructor key length and optional value_serializer func:

new_dict = HashMap(267, value_serializer=lambda src, dest: dest.store_coins(src))
#  or
new_dict = HashMap(267).with_coins_values()

Key should has one of the following type: int, str, bytes, Address. Value could be any if specified value_serializer, otherwise value must be cell. To set a value use set method:

new_dict.set(key=Address('EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG'), value=15)\
        .set(key=Address('EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N'), value=10)

Then call serialize method:

new_dict_cell = new_dict.serialize()
print(new_dict_cell)

>>> 22[817000] -> {
 	297[BFF7ADE33CC37032184B0ECEF80219C935266C972CBEEEC553021B22D6105E8BC10000000780],
 	297[BFC1EFEAA9731B94DA397E5E64622F5E63348B812AC5B4763A93F0DD201D0798D40000000780]
  }

If you have not set any values, serialize return None.

Parsing

You can parse dict using HashMap's parse method, or load it from a slice:

def key_deserializer(src):
    return Builder().store_bits(src).to_slice().load_address()


def value_deserializer(src):
    return src.load_coins()


hashmap_e = Builder().store_bit(1).store_dict(new_dict_cell).end_cell()

print(hashmap_e.begin_parse().load_dict(267))
print(new_dict_cell.begin_parse().load_hashmap(267, key_deserializer, value_deserializer))

print(HashMap.parse(new_dict_cell.begin_parse(), 267, key_deserializer, value_deserializer))

>>> {118621468258109555883414559823777639640406072296410285331234498098430527437346690: <Slice 12[10F0] -> 0 refs>, 118630747841378569603204119301805376564831504145530059638093173869611524683674024: <Slice 12[10A0] -> 0 refs>}
>>> {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}
>>> {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}

HashmapAug

Currently there is no individual class for HashmapAugs, they are used only in TLB schemes deserialization. But you can load them and even parse from slices:

class ShardAccounts(TlbScheme):
    """
    _ (HashmapAugE 256 ShardAccount DepthBalanceInfo) = ShardAccounts;
    """
    def serialize(self, *args):
        ...

    @classmethod
    def deserialize(cls, cell_slice: Slice):
        return cell_slice.load_hashmap_aug_e(key_length=256,
                                             x_deserializer=ShardAccount.deserialize,
                                             y_deserializer=DepthBalanceInfo.deserialize)

The load_hashmap_aug_e method returns dict with parsed values and list with parsed extras.

Last updated