Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 130 additions & 33 deletions contract/sources/member.move
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ use nextart_community::version::{Version,OffChainValidator, check_version,off_ch
public struct MEMBER has drop {}

// ====== Errors =======
const ERROR_INVALID_VALIDATION: u64 = 0;

const ERROR_INVALID_VALIDATION: u64 = 0;

#[allow(unused_field)]
public struct Member has key {
Expand Down Expand Up @@ -65,10 +64,10 @@ public struct EditMemberEvent has copy, drop {
}

public struct UpdateMemberRecordEvent has copy, drop {
addr:address,
amount:u64,
balance:u64,
type_name:String
addr: address,
amount: u64,
balance: u64,
type_name: String,
}

fun init(otw: MEMBER, ctx: &mut TxContext) {
Expand Down Expand Up @@ -111,35 +110,31 @@ fun init(otw: MEMBER, ctx: &mut TxContext) {
transfer::public_transfer(member_display, deployer);
}

public fun Pay(
record: &mut MemberRecord,
coin: Coin<SUI>,
ctx: &mut TxContext,
): Receipt {
public fun Pay(record: &mut MemberRecord, coin: Coin<SUI>, ctx: &mut TxContext): Receipt {
let value = coin::value(&coin);
balance::join(&mut record.pool, coin::into_balance(coin));
let receipt = Receipt {
amount: value,
};
emit(UpdateMemberRecordEvent{
emit(UpdateMemberRecordEvent {
addr: ctx.sender(),
amount: 0,
balance: value,
type_name:string::utf8(b"payment")
type_name: string::utf8(b"payment"),
});
receipt
}

public fun mint_member(
record: &mut MemberRecord,
sig:vector<u8>,
record: &mut MemberRecord,
sig: vector<u8>,
name: String,
avatar: String,
introduction: String,
version: &Version,
clock: &Clock,
receipt: Receipt,
ctx: &mut TxContext
ctx: &mut TxContext,
) {
check_version(version);
assert!(off_chain_validation<address>(sig, ctx.sender()), ERROR_INVALID_VALIDATION);
Expand All @@ -166,10 +161,10 @@ public fun mint_member(
}

public fun drop_member(
record: &mut MemberRecord,
record: &mut MemberRecord,
member: Member,
version: &Version,
ctx: &mut TxContext
ctx: &mut TxContext,
) {
let sender = ctx.sender();
check_version(version);
Expand All @@ -182,7 +177,7 @@ public fun drop_member(
let Member {
id,
collections,
..
..,
} = member;
object::delete(id);
table::drop<String, ID>(collections);
Expand All @@ -193,14 +188,17 @@ public fun edit_member(
mut name: Option<String>,
mut avatar: Option<String>,
mut introduction: Option<String>,
sig:vector<u8>,
sig: vector<u8>,
version: &Version,
clock: &Clock,
ctx: &TxContext
ctx: &TxContext,
) {
check_version(version);
let off_chain_validator = create_off_chain_validator(member.last_time,ctx);
assert!(off_chain_validation<OffChainValidator>(sig, off_chain_validator), ERROR_INVALID_VALIDATION);
let off_chain_validator = create_off_chain_validator(member.last_time, ctx);
assert!(
off_chain_validation<OffChainValidator>(sig, off_chain_validator),
ERROR_INVALID_VALIDATION,
);
if (name.is_some()) {
member.name = option::extract(&mut name);
};
Expand All @@ -225,35 +223,134 @@ public fun points(member: &Member): u64 {
member.points
}

public fun points_member_record(record: &mut MemberRecord, ctx: &TxContext): &u64 {
let sender = ctx.sender();
assert!(table::contains<address, u64>(&record.record, sender), ERROR_INVALID_VALIDATION);
table::borrow(&record.record, sender)
}

public fun add_points(
member: &mut Member,
version: &Version,
sig:vector<u8>,
sig: vector<u8>,
amount: u64,
clock:&Clock,
ctx: &TxContext
clock: &Clock,
ctx: &TxContext,
) {
check_version(version);
let off_chain_validator = create_off_chain_validator(member.last_time,ctx);
assert!(off_chain_validation<OffChainValidator>(sig, off_chain_validator), ERROR_INVALID_VALIDATION);
let off_chain_validator = create_off_chain_validator(member.last_time, ctx);
assert!(
off_chain_validation<OffChainValidator>(sig, off_chain_validator),
ERROR_INVALID_VALIDATION,
);
let points = &mut member.points;
*points = *points + amount;
member.last_time = clock::timestamp_ms(clock);
emit(UpdateMemberRecordEvent{
emit(UpdateMemberRecordEvent {
addr: ctx.sender(),
amount,
balance: 0,
type_name:string::utf8(b"add_points")
type_name: string::utf8(b"add_points"),
});
}

public fun update_points(
record: &mut MemberRecord,
record: &mut MemberRecord,
member: &Member,
version: &Version,
ctx: &TxContext
ctx: &TxContext,
) {
check_version(version);
assert!(table::contains<address, u64>(&record.record, ctx.sender()), ERROR_INVALID_VALIDATION);
let points = &mut record.record[ctx.sender()];
*points = points(member);
}
}

#[test_only]
public fun init_for_testing(ctx: &mut TxContext) {
init(MEMBER {}, ctx)
}

#[test_only]
public fun mint_member_for_testing(
record: &mut MemberRecord,
name: String,
avatar: String,
introduction: String,
version: &Version,
clock: &Clock,
receipt: Receipt,
ctx: &mut TxContext,
) {
check_version(version);
let sender = ctx.sender();
let Receipt { amount } = receipt;
table::add<address, u64>(&mut record.record, sender, amount);
let member = Member {
id: object::new(ctx),
name,
avatar,
introduction,
collections: table::new<String, ID>(ctx),
points: 0,
last_time: clock::timestamp_ms(clock),
};
emit(MintMemberEvent {
sender,
name,
avatar,
introduction,
member: object::id(&member),
});
transfer::transfer(member, sender);
}
#[test_only]
public fun edit_member_for_testing(
member: &mut Member,
mut name: Option<String>,
mut avatar: Option<String>,
mut introduction: Option<String>,
version: &Version,
clock: &Clock,
ctx: &TxContext,
) {
check_version(version);
// 测试版本跳过签名验证
if (name.is_some()) {
member.name = option::extract(&mut name);
};
if (avatar.is_some()) {
member.avatar = option::extract(&mut avatar);
};
if (introduction.is_some()) {
member.introduction = option::extract(&mut introduction);
};
member.last_time = clock::timestamp_ms(clock);

emit(EditMemberEvent {
sender: ctx.sender(),
name: member.name,
avatar: member.avatar,
introduction: member.introduction,
member: object::id(member),
});
}
#[test_only]
public fun add_points_for_testing(
member: &mut Member,
version: &Version,
amount: u64,
clock: &Clock,
ctx: &TxContext,
) {
check_version(version);
let points = &mut member.points;
*points = *points + amount;
member.last_time = clock::timestamp_ms(clock);
emit(UpdateMemberRecordEvent {
addr: ctx.sender(),
amount,
balance: 0,
type_name: string::utf8(b"add_points"),
});
}
6 changes: 5 additions & 1 deletion contract/sources/version.move
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,8 @@ public fun check_version(version: &Version) {
public fun update_version(_admin: &SuperAdminCap, version: &mut Version) {
assert!(version.version < VERSION);
version.version = VERSION;
}
}
#[test_only]
entry fun init_for_test(ctx: &mut TxContext) {
init(ctx);
}
Loading