Chapter 3: Advanced

Lesson 8: Map – Adding entries

After finishing the code in the True branch of the condition, let’s focus on the False branch of the condition.

This branch implies that the user information has not previously existed in the maps, so what we now have to do is to register the user by updating their information in the maps of users and used_usernames.

To add these values, we’ll be using in place insert operations that have the given format.

Where m is the map variable, k is the key variable and v is the value variable. Insertion into nested maps is supported with the syntax m[k1][k2][...] := v. If the intermediate key(s) does not exist in the nested maps, they are freshly created along with the map values they are associated with.

We have a task for you!

  • First, in the library section define a variable true which will be equal to True.
    Hint: for boolean variables, you can do this by typing let true = True in the library section. See the Cheat sheet below for a quick refresher.
  • Then, come to the False branch in the transition. There, using the format described above, insert the value variable twitter_username with the corresponding key variable user_address in the map users.
  • Similarly, in the next line, insert the value variable true with the corresponding key variable twitter_username in the map used_usernames.
  • Your Workspace

    Show Solution

    Solution

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    scilla_version 0
    import BoolUtils
    library SocialMediaPayment
    let one_msg =
    fun (msg: Message) =>
    let nil_msg = Nil {Message} in
    Cons {Message} msg nil_msg
    let zero = Uint128 0
    let not_owner_code = Uint32 1
    let accepted_code = Uint32 0
    let user_exists_code = Uint32 2
    (* Start typing from the line below to define the variable ‘user_exists_code’ of type Uint32 and value ‘2’*)
    let true = True
    contract SocialMediaPayment (owner: ByStr20)
    field users: Map ByStr20 String
    = Emp ByStr20 String
    field used_usernames: Map String Bool
    = Emp String Bool
    transition deposit()
    sender_is_owner = builtin eq _sender owner;
    match sender_is_owner with
    | False =>
    msg = { _tag: "";
    _recipient: _sender;
    _amount: zero;
    code: not_owner_code };
    msgs = one_msg msg;
    send msgs
    | True =>
    accept;
    msg = { _tag: "";
    _recipient: _sender;
    _amount: zero;
    code: accepted_code};
    msgs = one_msg msg;
    send msgs
    end
    end
    transition register_user (user_address: ByStr20, twitter_username: String)
    user_exists <- exists users[user_address];
    username_exists <- exists used_usernames[twitter_username]
    already_exists = orb user_exists username_exists
    match already_exists with
    | True =>
    msg = {_tag: ""; _recipient: _sender; _amount: zero; code: user_exists_code};
    msgs = one_msg msg;
    send msgs
    | False =>
    (* Start typing from the line below *)
    users[user_address] := twitter_username;
    used_usernames[twitter_username] := true
    end
    end
    scilla_version 0
    import BoolUtils
    
    library SocialMediaPayment
    
    let one_msg = 
      fun (msg: Message) => 
      let nil_msg = Nil {Message} in
      Cons {Message} msg nil_msg
    
    let zero = Uint128 0
    let not_owner_code = Uint32 1
    let accepted_code = Uint32 0
    let user_exists_code = Uint32 2
    
    (* Start typing from the line below to define the variable ‘user_exists_code’ of type Uint32 and value ‘2’*)
    
    contract SocialMediaPayment (owner: ByStr20)
    
    
    field users: Map ByStr20 String
      = Emp ByStr20 String
    
    field used_usernames: Map String Bool
      = Emp String Bool
    
    transition deposit()
      sender_is_owner = builtin eq _sender owner;
      match sender_is_owner with
      | False =>
    
        msg = { _tag: "";
                _recipient: _sender;
                _amount: zero;
                code: not_owner_code };
        msgs = one_msg msg;
        send msgs
    
      | True =>
        accept;
        msg = { _tag: "";
                _recipient: _sender;
                _amount: zero;
                code: accepted_code};
        msgs = one_msg msg;
        send msgs
    
      end
    end
    
    transition register_user (user_address: ByStr20, twitter_username: String)
    
      user_exists <- exists users[user_address];
      username_exists <- exists used_usernames[twitter_username]
      already_exists = orb user_exists username_exists
    
      match already_exists with
      | True =>
    
        msg = {_tag: ""; _recipient: _sender; _amount: zero; code: user_exists_code};
        msgs = one_msg msg;
        send msgs
    
      | False =>
    
        (* Start typing from the line below *)
    
      end
    end
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69