Skip to content

Commit

Permalink
Merge pull request #59 from MystenLabs/tlee/move-migration
Browse files Browse the repository at this point in the history
[move-2024] Suins Move 2024 Migration
  • Loading branch information
leecchh authored Mar 28, 2024
2 parents c27cbc9 + ee9970e commit 8cec8f0
Show file tree
Hide file tree
Showing 68 changed files with 683 additions and 605 deletions.
13 changes: 10 additions & 3 deletions packages/coupons/Move.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# @generated by Move, please check-in and do not edit manually.

[move]
version = 0
version = 1
manifest_digest = "F6F1ED65982D6E0324AD5094A06FB092A7A055409AB912038DC0D2DA42E13854"
deps_digest = "3C4103934B1E040BB6B23F1D610B4EF9F2F1166A50A104EADCF77467C004C600"

dependencies = [
{ name = "Sui" },
Expand All @@ -10,11 +12,11 @@ dependencies = [

[[move.package]]
name = "MoveStdlib"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "testnet", subdir = "crates/sui-framework/packages/move-stdlib" }
source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet", subdir = "crates/sui-framework/packages/move-stdlib" }

[[move.package]]
name = "Sui"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "testnet", subdir = "crates/sui-framework/packages/sui-framework" }
source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet", subdir = "crates/sui-framework/packages/sui-framework" }

dependencies = [
{ name = "MoveStdlib" },
Expand All @@ -27,3 +29,8 @@ source = { local = "../suins" }
dependencies = [
{ name = "Sui" },
]

[move.toolchain-version]
compiler-version = "1.22.0"
edition = "legacy"
flavor = "sui"
1 change: 1 addition & 0 deletions packages/coupons/Move.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[package]
name = "coupons"
version = "0.0.1"
edition = "2024.beta"

[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet", override=true }
Expand Down
30 changes: 15 additions & 15 deletions packages/coupons/sources/coupons.move
Original file line number Diff line number Diff line change
Expand Up @@ -49,20 +49,20 @@ module coupons::coupons {
use suins::registry::{Self, Registry};

// Authorization for the Coupons on SuiNS, to be able to register names on the app.
struct CouponsApp has drop {}
public struct CouponsApp has drop {}
/// Authorization Key for secondary apps (e.g. Discord) connected to this module.
struct AppKey<phantom App: drop> has copy, store, drop {}
public struct AppKey<phantom App: drop> has copy, store, drop {}

/// Create a `Data` struct that only authorized apps can get mutable access to.
/// We don't save the coupon's table directly on the shared object, because we want authorized apps to only perform
/// certain actions with the table (and not give full `mut` access to it).
struct Data has store {
public struct Data has store {
// hold a list of all coupons in the system.
coupons: Table<String, Coupon>
}

/// The CouponHouse Shared Object which holds a table of coupon codes available for claim.
struct CouponHouse has key, store {
public struct CouponHouse has key, store {
id: UID,
data: Data,
version: u8
Expand All @@ -72,8 +72,8 @@ module coupons::coupons {
/// - `Rules` are defined on the module `rules`, and covers a variety of everything we needed for the service.
/// - `type` is a u8 constant, defined on `constants` which makes a coupon fixed price or discount percentage
/// - `value` is a u64 constant, which can be in the range of (0,100] for discount percentage, or any value > 0 for fixed price.
struct Coupon has copy, store, drop {
type: u8, // 0 -> Percentage Discount | 1 -> Fixed Discount
public struct Coupon has copy, store, drop {
`type`: u8, // 0 -> Percentage Discount | 1 -> Fixed Discount
amount: u64, // if type == 0, we need it to be between 0, 100. We only allow int stlye (not 0.5% discount).
rules: CouponRules, // A list of base Rules for the coupon.
}
Expand Down Expand Up @@ -209,13 +209,13 @@ module coupons::coupons {
_: &AdminCap,
self: &mut CouponHouse,
code: String,
type: u8,
`type`: u8,
amount: u64,
rules: CouponRules,
ctx: &mut TxContext
) {
assert_version_is_valid(self);
internal_save_coupon(&mut self.data, code, internal_create_coupon(type, amount, rules, ctx));
internal_save_coupon(&mut self.data, code, internal_create_coupon(`type`, amount, rules, ctx));
}

// Remove a coupon as a system's admin.
Expand All @@ -227,12 +227,12 @@ module coupons::coupons {
public fun app_add_coupon(
self: &mut Data,
code: String,
type: u8,
`type`: u8,
amount: u64,
rules: CouponRules,
ctx: &mut TxContext
){
internal_save_coupon(self, code, internal_create_coupon(type, amount, rules, ctx));
internal_save_coupon(self, code, internal_create_coupon(`type`, amount, rules, ctx));
}

// Remove a coupon as a registered app.
Expand All @@ -244,7 +244,7 @@ module coupons::coupons {
/// A helper to calculate the final price after the discount.
fun internal_calculate_sale_price(price: u64, coupon: &Coupon): u64{
// If it's fixed price, we just deduce the amount.
if(coupon.type == constants::fixed_price_discount_type()){
if(coupon.`type` == constants::fixed_price_discount_type()){
if(coupon.amount > price) return 0; // protect underflow case.
return price - coupon.amount
};
Expand All @@ -268,15 +268,15 @@ module coupons::coupons {

/// An internal function to create a coupon object.
fun internal_create_coupon(
type: u8,
`type`: u8,
amount: u64,
rules: CouponRules,
_ctx: &mut TxContext
): Coupon {
rules::assert_is_valid_amount(type, amount);
rules::assert_is_valid_discount_type(type);
rules::assert_is_valid_amount(`type`, amount);
rules::assert_is_valid_discount_type(`type`);
Coupon {
type, amount, rules
`type`, amount, rules
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/coupons/sources/range.move
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ module coupons::range {
const EInvalidRange: u64 = 0;

/// A Range for u8 helper
struct Range has copy, store, drop {
public struct Range has copy, store, drop {
vec: vector<u8>
}

Expand Down
10 changes: 5 additions & 5 deletions packages/coupons/sources/rules.move
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ module coupons::rules {
/// The Struct that holds the coupon's rules.
/// All rules are combined in `AND` fashion.
/// All of the checks have to pass for a coupon to be used.
struct CouponRules has copy, store, drop {
public struct CouponRules has copy, store, drop {
length: Option<Range>,
available_claims: Option<u64>,
user: Option<address>,
Expand Down Expand Up @@ -118,15 +118,15 @@ module coupons::rules {
range::is_in_range(option::borrow(&rules.years), target)
}

public fun assert_is_valid_discount_type(type: u8) {
assert!(vector::contains(&constants::discount_rule_types(), &type), EInvalidType);
public fun assert_is_valid_discount_type(`type`: u8) {
assert!(vector::contains(&constants::discount_rule_types(), &`type`), EInvalidType);
}

// verify that we are creating the coupons correctly (based on amount & type).
// for amounts, if we have a percentage discount, our max num is 100.
public fun assert_is_valid_amount(type: u8, amount: u64) {
public fun assert_is_valid_amount(`type`: u8, amount: u64) {
assert!(amount > 0, EInvalidAmount); // protect from division by 0. 0 doesn't make sense in any scenario.
if(type == constants::percentage_discount_type()){
if(`type` == constants::percentage_discount_type()){
assert!(amount<=100, EInvalidAmount)
}
}
Expand Down
14 changes: 7 additions & 7 deletions packages/coupons/tests/authorization_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ module coupons::app_authorization_tests {

#[test]
fun admin_get_app_success() {
let scenario_val = setup::test_init();
let mut scenario_val = setup::test_init();
let scenario = &mut scenario_val;
// auth style as authorized app
{
test_scenario::next_tx(scenario, user());
let coupon_house = test_scenario::take_shared<CouponHouse>(scenario);
let mut coupon_house = test_scenario::take_shared<CouponHouse>(scenario);
coupons::app_data_mut<TestApp>(setup::test_app(), &mut coupon_house);
test_scenario::return_shared(coupon_house);
};
Expand All @@ -29,12 +29,12 @@ module coupons::app_authorization_tests {

#[test]
fun authorized_app_get_app_success(){
let scenario_val = setup::test_init();
let mut scenario_val = setup::test_init();
let scenario = &mut scenario_val;
{
test_scenario::next_tx(scenario, admin());

let coupon_house = test_scenario::take_shared<CouponHouse>(scenario);
let mut coupon_house = test_scenario::take_shared<CouponHouse>(scenario);
let admin_cap = test_scenario::take_from_sender<AdminCap>(scenario);

// test app deauthorization.
Expand All @@ -49,13 +49,13 @@ module coupons::app_authorization_tests {
test_scenario::end(scenario_val);
}

#[test, expected_failure(abort_code=coupons::coupons::EAppNotAuthorized)]
#[test, expected_failure(abort_code=::coupons::coupons::EAppNotAuthorized)]
fun unauthorized_app_failure() {
let scenario_val = setup::test_init();
let mut scenario_val = setup::test_init();
let scenario = &mut scenario_val;
{
test_scenario::next_tx(scenario, user());
let coupon_house = test_scenario::take_shared<CouponHouse>(scenario);
let mut coupon_house = test_scenario::take_shared<CouponHouse>(scenario);
coupons::app_data_mut<UnauthorizedTestApp>(setup::unauthorized_test_app(), &mut coupon_house);
test_scenario::return_shared(coupon_house);
};
Expand Down
Loading

0 comments on commit 8cec8f0

Please sign in to comment.