Now, we want to limit the possibility of a same account creating multiple registrations.
In order to do so, we want to impose two conditions:
In order to impose these conditions, we’ll first have to create two records, one of already registered wallet ids and second of already registered twitter ids.
We’ll do so using map
feature.
A map of type map kt vt
provides a key-value store where kt
is the type of keys and vt
is the type of values. kt
may be any one of String, IntX, UintX, ByStrX or ByStr. vt
may be any type except a function type.
We often provide the key-value kt
as an input and look for the vt
as the output value. For eg, kt
could be a bank account number and vt
could be the corresponding bank balance.
The declaration for an empty map is done as follows at the start of the contract.
Then the values are added to that empty map. (You can also check the other ways of declaring map in the Cheat Sheet.)
After the start of the contract, declare two maps with no initial values:
map
with name users
with key type ByStr20
and value type String
.map
with name used_usernames
with key type String
and value type Bool
.Show Solution
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
contract SocialMediaPayment (owner: ByStr20)
(* Start typing from the line below *)
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)
end
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748