Events
Events are the main way to track actions on chain.
/// Extended example of a shared object. Now with addition of events!
module examples::donuts_with_events {
use sui::sui::SUI;
use sui::coin::{Self, Coin};
use sui::balance::{Self, Balance};
// This is the only dependency you need for events.
use sui::event;
/// For when Coin balance is too low.
const ENotEnough: u64 = 0;
/// Capability that grants an owner the right to collect profits.
public struct ShopOwnerCap has key { id: UID }
/// A purchasable Donut. For simplicity's sake we ignore implementation.
public struct Donut has key { id: UID }
public struct DonutShop has key {
id: UID,
price: u64,
balance: Balance<SUI>
}
// ====== Events ======
/// For when someone has purchased a donut.
public struct DonutBought has copy, drop {
id: ID
}
/// For when DonutShop owner has collected profits.
public struct ProfitsCollected has copy, drop {
amount: u64
}
// ====== Functions ======
fun init(ctx: &mut TxContext) {
transfer::transfer(ShopOwnerCap {
id: object::new(ctx)
}, ctx.sender());
transfer::share_object(DonutShop {
id: object::new(ctx),
price: 1000,
balance: balance::zero()
})
}
/// Buy a donut.
public fun buy_donut(
shop: &mut DonutShop, payment: &mut Coin<SUI>, ctx: &mut TxContext
) {
assert!(coin::value(payment) >= shop.price, ENotEnough);
let paid = payment.balance_mut().split(shop.price);
let id = object::new(ctx);
shop.balance.join(paid);
// Emit the event using future object's ID.
event::emit(DonutBought { id: id.to_inner() });
transfer::transfer(Donut { id }, ctx.sender())
}
/// Consume donut and get nothing...
public fun eat_donut(d: Donut) {
let Donut { id } = d;
object::delete(id);
}
/// Take coin from `DonutShop` and transfer it to tx sender.
/// Requires authorization with `ShopOwnerCap`.
public fun collect_profits(
_: &ShopOwnerCap, shop: &mut DonutShop, ctx: &mut TxContext
): Coin<SUI> {
let amount = shop.balance.value();
// simply create new type instance and emit it
event::emit(ProfitsCollected { amount });
shop.balance.split(amount).into_coin(ctx)
}
}