From bce79c975905ff21d9ced2f6412f0d209b587932 Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 9 Nov 2022 11:19:14 +0900 Subject: [PATCH 1/3] topic: Sui Patterns -> Hot Potato --- examples.sui.io/basics/Move.toml | 1 + .../basics/sources/hot_potato.move | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 examples.sui.io/basics/sources/hot_potato.move diff --git a/examples.sui.io/basics/Move.toml b/examples.sui.io/basics/Move.toml index d78e24c..d3e5328 100644 --- a/examples.sui.io/basics/Move.toml +++ b/examples.sui.io/basics/Move.toml @@ -7,4 +7,5 @@ Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-fram [addresses] basics = "0x0" +patterns = "0x0" sui = "0000000000000000000000000000000000000002" diff --git a/examples.sui.io/basics/sources/hot_potato.move b/examples.sui.io/basics/sources/hot_potato.move new file mode 100644 index 0000000..a5eeb57 --- /dev/null +++ b/examples.sui.io/basics/sources/hot_potato.move @@ -0,0 +1,44 @@ +module patterns::trade_in { + use sui::coin::{Self, Coin}; + use sui::transfer; + use sui::sui::SUI; + use sui::object::{Self, UID}; + use sui::tx_context::{TxContext}; + + const MODEL_ONE_PRICE: u64 = 10000; + const MODEL_TWO_PRICE: u64 = 20000; + const EWrongModel: u64 = 1; + const EIncorrectAmount: u64 = 2; + + struct Phone has key, store { id: UID, model: u8 } + + struct Receipt { price: u64 } + + public fun buy_phone(model: u8, ctx: &mut TxContext): (Phone, Receipt) { + assert!(model == 1 || model == 2, EWrongModel); + let price = if (model == 1) MODEL_ONE_PRICE else MODEL_TWO_PRICE; + + ( + Phone { id: object::new(ctx), model }, + Receipt { price } + ) + } + + public fun pay_full(receipt: Receipt, payment: Coin) { + let Receipt { price } = receipt; + assert!(coin::value(&payment) == price, EIncorrectAmount); + + transfer::transfer(payment, @patterns); + } + + public fun trade_in(receipt: Receipt, old_phone: Phone, payment: Coin) { + let Receipt { price } = receipt; + let tradein_price = if (old_phone.model == 1) MODEL_ONE_PRICE else MODEL_TWO_PRICE; + let to_pay = price - (tradein_price / 2); + + assert!(coin::value(&payment) == to_pay, EIncorrectAmount); + + transfer::transfer(old_phone, @patterns); + transfer::transfer(payment, @patterns); + } +} From 818b84b60a56b69359c0457e0b66094e6ccd4bc6 Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 9 Nov 2022 11:38:52 +0900 Subject: [PATCH 2/3] topic: Sui Patterns -> ID Pointer --- .../basics/sources/id_pointer.move | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 examples.sui.io/basics/sources/id_pointer.move diff --git a/examples.sui.io/basics/sources/id_pointer.move b/examples.sui.io/basics/sources/id_pointer.move new file mode 100644 index 0000000..cfdff18 --- /dev/null +++ b/examples.sui.io/basics/sources/id_pointer.move @@ -0,0 +1,71 @@ +module patterns::lock_and_key { + use std::option::{Self, Option}; + use sui::object::{Self, ID, UID}; + use sui::tx_context::{Self, TxContext}; + use sui::transfer; + + const ELockIsEmpty: u64 = 0; + const EKeyMismatch: u64 = 1; + const ELockIsFull: u64 = 2; + + struct Lock has key { + id: UID, + locked: Option + } + + struct Key has key, store { + id: UID, + for: ID + } + + public fun key_for(key: &Key): ID { + key.for + } + + public entry fun create(obj: T, ctx: &mut TxContext) { + let id = object::new(ctx); + let for = object::uid_to_inner(&id); + + transfer::share_object(Lock { + id, + locked: option::some(obj) + }); + + transfer::transfer( + Key { + for, + id: object::new(ctx) + }, + tx_context::sender(ctx) + ); + } + + public entry fun lock( + obj: T, + lock: &mut Lock, + key: &Key + ) { + assert!(option::is_none(&lock.locked), ELockIsFull); + assert!(&key.for == object::borrow_id(lock), EKeyMismatch); + + option::fill(&mut lock.locked, obj); + } + + public entry fun unlock( + lock: &mut Lock, + key: &Key + ): T { + assert!(option::is_some(&lock.locked), ELockIsEmpty); + assert!(&key.for == object::borrow_id(lock), EKeyMismatch); + + option::extract(&mut lock.locked) + } + + public fun take( + lock: &mut Lock, + key: &Key, + ctx: &mut TxContext + ) { + transfer::transfer(unlock(lock, key), tx_context::sender(ctx)); + } +} \ No newline at end of file From 83d70a7b2d0cd1e65faac2da75ea3d177a7721de Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 9 Nov 2022 11:39:49 +0900 Subject: [PATCH 3/3] clean --- examples.sui.io/basics/sources/id_pointer.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples.sui.io/basics/sources/id_pointer.move b/examples.sui.io/basics/sources/id_pointer.move index cfdff18..7d33714 100644 --- a/examples.sui.io/basics/sources/id_pointer.move +++ b/examples.sui.io/basics/sources/id_pointer.move @@ -68,4 +68,4 @@ module patterns::lock_and_key { ) { transfer::transfer(unlock(lock, key), tx_context::sender(ctx)); } -} \ No newline at end of file +}