Skip to content
Closed
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
33 changes: 30 additions & 3 deletions creator-keys/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
#![no_std]

use soroban_sdk::{contract, contractimpl, contracttype, symbol_short, Address, Env, String};
use soroban_sdk::{
contract, contracterror, contractimpl, contracttype, symbol_short, Address, Env, String,
};

#[contracterror]
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
#[repr(u32)]
pub enum ContractError {
AlreadyRegistered = 1,
NotRegistered = 2,
}

pub mod fee {
use soroban_sdk::contracttype;
Expand Down Expand Up @@ -122,7 +132,11 @@ impl CreatorKeysContract {

#[contractimpl]
impl CreatorKeysContract {
pub fn register_creator(env: Env, creator: Address, handle: String) {
pub fn register_creator(
env: Env,
creator: Address,
handle: String,
) -> Result<(), ContractError> {
creator.require_auth();

let key = DataKey::Creator(creator.clone());
Expand All @@ -138,6 +152,8 @@ impl CreatorKeysContract {

env.storage().persistent().set(&key, &profile);
env.events().publish((symbol_short!("register"),), key);

Ok(())
}

pub fn buy_key(env: Env, creator: Address, buyer: Address, payment: i128) -> u32 {
Expand All @@ -154,7 +170,15 @@ impl CreatorKeysContract {
}

let key = DataKey::Creator(creator.clone());
<<<<<<< mergeconflicts
let mut profile: CreatorProfile = env
.storage()
.persistent()
.get(&key)
.ok_or(ContractError::NotRegistered)?;
=======
let mut profile = Self::require_creator(&env, &creator);
>>>>>>> main

profile.supply += 1;
env.storage().persistent().set(&key, &profile);
Expand All @@ -168,7 +192,7 @@ impl CreatorKeysContract {
env.events()
.publish((symbol_short!("buy"), creator, buyer), profile.supply);

profile.supply
Ok(profile.supply)
}

pub fn get_key_balance(env: Env, creator: Address, wallet: Address) -> u32 {
Expand Down Expand Up @@ -333,3 +357,6 @@ mod tests {
}
}
}

#[cfg(test)]
mod test;
70 changes: 70 additions & 0 deletions creator-keys/src/test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
use super::*;
use soroban_sdk::{testutils::Address as _, Address, Env, String};

#[test]
fn test_register_creator() {
let env = Env::default();
env.mock_all_auths();
let contract_id = env.register(CreatorKeysContract, ());
let client = CreatorKeysContractClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let handle = String::from_str(&env, "alice");

client.register_creator(&creator, &handle);

let profile = client.get_creator(&creator).unwrap();
assert_eq!(profile.handle, handle);
assert_eq!(profile.creator, creator);
assert_eq!(profile.supply, 0);
}

#[test]
fn test_duplicate_registration_fails() {
let env = Env::default();
env.mock_all_auths();
let contract_id = env.register(CreatorKeysContract, ());
let client = CreatorKeysContractClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let handle = String::from_str(&env, "alice");

client.register_creator(&creator, &handle);

// Second registration should fail with AlreadyRegistered error
let result = client.try_register_creator(&creator, &handle);
assert_eq!(result, Err(Ok(ContractError::AlreadyRegistered)));
}

#[test]
fn test_buy_key_fails_if_not_registered() {
let env = Env::default();
env.mock_all_auths();
let contract_id = env.register(CreatorKeysContract, ());
let client = CreatorKeysContractClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let buyer = Address::generate(&env);

let result = client.try_buy_key(&creator, &buyer);
assert_eq!(result, Err(Ok(ContractError::NotRegistered)));
}

#[test]
fn test_buy_key_success() {
let env = Env::default();
env.mock_all_auths();
let contract_id = env.register(CreatorKeysContract, ());
let client = CreatorKeysContractClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let handle = String::from_str(&env, "alice");
client.register_creator(&creator, &handle);

let buyer = Address::generate(&env);
let supply = client.buy_key(&creator, &buyer);
assert_eq!(supply, 1);

let profile = client.get_creator(&creator).unwrap();
assert_eq!(profile.supply, 1);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
{
"generators": {
"address": 3,
"nonce": 0
},
"auth": [
[],
[]
],
"ledger": {
"protocol_version": 22,
"sequence_number": 0,
"timestamp": 0,
"network_id": "0000000000000000000000000000000000000000000000000000000000000000",
"base_reserve": 0,
"min_persistent_entry_ttl": 4096,
"min_temp_entry_ttl": 16,
"max_entry_ttl": 6312000,
"ledger_entries": [
[
{
"contract_data": {
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": "ledger_key_contract_instance",
"durability": "persistent"
}
},
[
{
"last_modified_ledger_seq": 0,
"data": {
"contract_data": {
"ext": "v0",
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": "ledger_key_contract_instance",
"durability": "persistent",
"val": {
"contract_instance": {
"executable": {
"wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"storage": null
}
}
}
},
"ext": "v0"
},
4095
]
],
[
{
"contract_code": {
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
},
[
{
"last_modified_ledger_seq": 0,
"data": {
"contract_code": {
"ext": "v0",
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"code": ""
}
},
"ext": "v0"
},
4095
]
]
]
},
"events": []
}
Loading
Loading