Skip to content

Instantly share code, notes, and snippets.

@killerstorm
Created December 17, 2018 01:28
Show Gist options
  • Select an option

  • Save killerstorm/de8405b00d8900a1b2a53efd7a92134f to your computer and use it in GitHub Desktop.

Select an option

Save killerstorm/de8405b00d8900a1b2a53efd7a92134f to your computer and use it in GitHub Desktop.
class user { key pubkey; }
class channel {
key name;
admin: user;
}
class channel_member { key channel, member: user; }
class message {
key channel, timestamp;
index posted_by: user;
text;
}
class balance {
key user;
mutable amount: integer;
}
operation init (founder_pubkey: pubkey) {
require( (user@*{} limit 1).len() == 0 );
val founder = create user (founder_pubkey);
create balance (founder, 1000000);
}
function decrease_balance (user, deduct_amount: integer) {
require( balance@{user}.amount >= deduct_amount);
update balance@{user} (amount -= deduct_amount);
}
operation register_user (
existing_user_pubkey: pubkey,
new_user_pubkey: pubkey,
transfer_amount: integer
) {
require( is_signer(existing_user_pubkey) );
val registration_cost = 100;
val existing_user = user@{existing_user_pubkey};
require( transfer_amount > 0 );
decrease_balance(existing_user, transfer_amount + registration_cost);
val new_user = create user (new_user_pubkey);
create balance (new_user, transfer_amount);
}
operation transfer_tokens (from: pubkey, to: pubkey, transfer_amount: integer) {
require( is_signer(from) );
require( transfer_amount > 0 );
val from_user = user@{from};
decrease_balance(from_user, transfer_amount);
update balance@{user@{to}} (amount += transfer_amount );
}
operation create_channel ( admin_pubkey: pubkey, name) {
require( is_signer(admin_pubkey) );
val admin = user@{admin_pubkey};
decrease_balance(admin, 100);
val channel = create channel (admin, name);
create channel_member (channel, admin);
}
operation add_channel_member (admin_pubkey: pubkey, channel_name: name, member_pubkey: pubkey) {
require( is_signer(admin_pubkey) );
val admin_usr = user@{admin_pubkey};
decrease_balance(admin_usr, 1);
val channel = channel@{channel_name, admin==user@{admin_pubkey}};
create channel_member (channel, member=user@{member_pubkey});
}
operation delete_channel_member (admin_pubkey: pubkey, channel_name: name, member_pubkey: pubkey) {
require( is_signer(admin_pubkey) );
delete channel_member@{
channel@{channel_name, admin==user@{admin_pubkey}},
member=user@{member_pubkey}
};
}
operation post_message (channel_name: name, pubkey, message: text, nop: byte_array) {
require( is_signer(pubkey) );
val channel = channel@{channel_name};
val member = user@{pubkey};
require( channel_member@?{channel, member} );
decrease_balance(member, 1);
create message (channel, member, text=message, op_context.last_block_time);
}
query get_messages_since(channel_name: name, since_timestamp: timestamp, until_timestamp: timestamp) {
return message@*{ channel@{channel_name}, timestamp > since_timestamp }
( text, poster_pubkey=posted_by.pubkey, -sort timestamp );
}
query get_last_messages(channel_name: name) {
val messages = message@*{ channel@{channel_name} }
( text, poster_pubkey=posted_by.pubkey, -sort timestamp );
if(messages.size() != 0) {
return messages;
} else {
return null;
}
}
query get_last_message(channel_name: name) {
return message@?{channel@{channel_name} } (text, poster_pubkey=posted_by.pubkey, -sort timestamp) limit 1;
}
query get_channel_members(channel_name: name) {
return channel_member@*{channel@{channel_name}} (member.pubkey);
}
query get_balance(user_pubkey: text) {
return balance@{user@{byte_array(user_pubkey)}}.amount;
}
query get_channels(user_pubkey: text) {
return channel_member@*{member=user@{byte_array(user_pubkey)}}.channel.name;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment