Procedures
We proceed to declare the procedures that we will use in the RentOnZilliqa Smart Contract. We will declare the following types of procedures in this section. The source code.
- General Procedures
send_message
- Listing Management Procedures
set_listing_details
claim_rent_by_id
delete_listing_by_id
- Listing Booking Procedures
check_listing_available
check_amount_and_book
book_listing_by_id
General Procedures
Since we will send messages on multiple occasions in the contract, we create the send_message
procedure to send messages.
send_message
This procedure creates a message with the passed arguments. It uses the one_msg
library function to create a list of messages and then proceeds to send it. Note that the _recipient
is always the implicit variable _sender
.
Arguments | Description | Type |
---|---|---|
amount |
The amount to be sent with the message | Uint128 |
code |
The message code to be sent with the message | Int32 |
procedure send_message (amount: Uint128, code: Int32)
msg = {
_tag: "";
_recipient: _sender;
_amount: amount;
code: code
};
msgs = one_msg msg;
send msgs
end
Listing Management Procedures
This group of procedures is used in the transitions that a host account user may use to manage their listings.
set_listing_details
This procedure creates or updates the Listing Details for the given ID. It is used by the create_listing
and update_listing
transitions.
Arguments | Description | Type |
---|---|---|
id |
The ID of the listing | Uint128 |
name |
The name of the listing | String |
description |
The description of the listing | String |
price |
The price of the listing | Uint128 |
rooms |
The number of rooms in the listing | Uint32 |
bathrooms |
The number of bathrooms in the listing | Uint32 |
image |
A URL to an image of the listing | String |
location |
A Google Maps Plus Code for the location of the listing | String |
wifi |
The availability of WiFi at the listing | String |
laundry |
The availability of a Landry at the listing | String |
hvac |
The availability of an HVAC at the listing | String |
tv |
The availability of a TV at the listing | String |
kitchen |
The availability of a Kitchen at the listing | String |
procedure set_listing_details (
id: Uint128, name: String, description: String, price: Uint128,
rooms: Uint32, bathrooms: Uint32, image: String, location: String,
wifi: String, laundry: String, hvac: String, tv: String, kitchen: String
)
listing_name[id] := name;
listing_description[id] := description;
listing_price[id] := price;
listing_rooms[id] := rooms;
listing_bathrooms[id] := bathrooms;
listing_image[id] := image;
listing_location[id] := location;
listing_wifi[id] := wifi;
listing_laundry[id] := laundry;
listing_hvac[id] := hvac;
listing_tv[id] := tv;
listing_kitchen[id] := kitchen
end
claim_rent_by_id
This procedure is used in conjunction with the claim_rent
transition. The accumulated rent is checked for the listing with the given ID, in the listing_accumulated_rent
field. If the rent is missing or empty, the corresponding messages are sent using the send_message
procedure. If there is non-zero accumulated rent, it is sent to the _sender
using the send_message
procedure. The accumulated rent is passed as an argument to send_message
, along with the rent_claimed
message code. A "Rent Claimed" event is also emitted. The accumulated rent in the listing_accumulated_rent
field is set to zero for that ID, as it is claimed by the host account.
Arguments | Description | Type |
---|---|---|
id |
The ID of the listing | Uint128 |
procedure claim_rent_by_id (id: Uint128)
accumulated_rent <- listing_accumulated_rent[id];
match accumulated_rent with
| Some accumulated_rent =>
no_accumulated_rent = builtin eq accumulated_rent zero;
match no_accumulated_rent with
| True =>
send_message zero rent_empty
| False =>
listing_accumulated_rent[id] := zero;
e = { _eventname: "RentClaimed"; listing_id: id; renter: _sender; amount: accumulated_rent };
event e;
send_message accumulated_rent rent_claimed
end
| None =>
send_message zero listing_details_missing
end
end
delete_listing_by_id
This procedure is used in conjunction with the delete_listing
transition. It deletes the Listing Details entries for the listing with the given ID.
Arguments | Description | Type |
---|---|---|
id |
The ID of the listing | Uint128 |
procedure delete_listing_by_id (id: Uint128)
delete listing_name[id];
delete listing_description[id];
delete listing_price[id];
delete listing_rooms[id];
delete listing_image[id];
delete listing_host[id];
delete listing_renter[id];
delete listing_rented_till[id];
delete listing_accumulated_rent[id];
delete listing_bathrooms[id];
delete listing_location[id];
delete listing_wifi[id];
delete listing_laundry[id];
delete listing_hvac[id];
delete listing_tv[id];
delete listing_kitchen[id]
end
Listing Booking Procedures
check_listing_available
This procedure is used in conjunction with the book_listing
transition. It checks if the listing is available by checking the listing_rented_till
field. If it is not available, the listing_unavailable
message is sent back. When the listing is available, the check_amount_and_book
procedure is called with the id
.
Arguments | Description | Type |
---|---|---|
id |
The ID of the listing | Uint128 |
procedure check_listing_available (id: Uint128)
current_block_number <- & BLOCKNUMBER;
listing_rented_till_value <- listing_rented_till[id];
match listing_rented_till_value with
| Some listing_rented_till_value =>
is_rented_lt = builtin blt current_block_number listing_rented_till_value;
is_rented_eq = builtin eq current_block_number listing_rented_till_value;
listing_is_rented_check = orb is_rented_lt is_rented_eq;
match listing_is_rented_check with
| True =>
send_message zero listing_unavailable
| False =>
check_amount_and_book id
end
| None =>
send_message zero listing_details_missing
end
end
check_amount_and_book
This procedure is used in conjunction with the book_listing
transition. It is called after the listing's availibility is checked by the check_listing_available
procedure. It checks if the sent amount is equal to the listing_price
. If not, the wrong_amount_sent
is sent back. If the correct amount is sent, the book_listing_by_id
procedure is called with the id
.
Arguments | Description | Type |
---|---|---|
id |
The ID of the listing | Uint128 |
procedure check_amount_and_book (id: Uint128)
listing_price_value <- listing_price[id];
match listing_price_value with
| Some listing_price_value =>
correct_amount_check = builtin eq _amount listing_price_value;
match correct_amount_check with
| True =>
book_listing_by_id id
| False =>
send_message zero wrong_amount_sent
end
| None =>
send_message zero listing_details_missing
end
end
book_listing_by_id
This procedure is used in conjunction with the book_listing
transition. In this procedure, the accept
command is called. The night_duration
is added to the current BLOCKNUMBER
and assigned to the listing_rented_till
field. The _sender
wallet address is assigned to the listing_renter
field. The rent amount is added to the listing_accumulated_rent
field, after subtracting the commission set in the owners_commission
field. A "ListingBooked" event is emitted and a listing_booked
message is sent.
As the commission amount is stored in the contract balance, it can be claimed by the contract owner via the _balance
implicit variable.
Arguments | Description | Type |
---|---|---|
id |
The ID of the listing | Uint128 |
procedure book_listing_by_id (id: Uint128)
accumulated_rent <- listing_accumulated_rent[id];
match accumulated_rent with
| Some accumulated_rent =>
accept;
current_block_number <- & BLOCKNUMBER;
night_duration_value <- night_duration;
rented_till = builtin badd current_block_number night_duration_value;
listing_rented_till[id] := rented_till;
listing_renter[id] := _sender;
commission <- owners_commission;
rent = builtin sub _amount commission;
new_accumulated_rent = builtin add accumulated_rent rent;
listing_accumulated_rent[id] := new_accumulated_rent;
e = { _eventname: "ListingBooked"; listing_id: id; renter: _sender; amount: _amount };
event e;
send_message zero listing_booked
| None =>
send_message zero listing_details_missing
end
end