diff --git a/creator-keys/src/lib.rs b/creator-keys/src/lib.rs index 06d60c9..13e41f3 100644 --- a/creator-keys/src/lib.rs +++ b/creator-keys/src/lib.rs @@ -179,8 +179,10 @@ impl CreatorKeysContract { .ok_or(ContractError::Overflow)?; env.storage().persistent().set(&balance_key, &new_balance); - env.events() - .publish((symbol_short!("buy"), creator, buyer), profile.supply); + env.events().publish( + (symbol_short!("buy"), creator, buyer), + (profile.supply, payment), + ); Ok(profile.supply) } diff --git a/creator-keys/tests/buy_key_event.rs b/creator-keys/tests/buy_key_event.rs new file mode 100644 index 0000000..5ce2558 --- /dev/null +++ b/creator-keys/tests/buy_key_event.rs @@ -0,0 +1,59 @@ +//! Tests verifying that the buy-key event includes the payment amount. + +use creator_keys::{CreatorKeysContract, CreatorKeysContractClient}; +use soroban_sdk::{symbol_short, testutils::Address as _, testutils::Events, Env, IntoVal, String}; + +#[test] +fn test_buy_key_event_includes_payment_amount() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = env.register(CreatorKeysContract, ()); + let client = CreatorKeysContractClient::new(&env, &contract_id); + + let admin = soroban_sdk::Address::generate(&env); + let creator = soroban_sdk::Address::generate(&env); + let buyer = soroban_sdk::Address::generate(&env); + + client.set_key_price(&admin, &100i128); + client.register_creator(&creator, &String::from_str(&env, "alice")); + let supply = client.buy_key(&creator, &buyer, &150i128); + assert_eq!(supply, 1); + + let events = env.events().all(); + // Last event is the buy event + let buy_event = events.last().unwrap(); + // Data is (supply, payment) + let (event_supply, event_payment): (u32, i128) = buy_event.2.into_val(&env); + assert_eq!(event_supply, 1u32); + assert_eq!(event_payment, 150i128); +} + +#[test] +fn test_buy_key_event_topics_include_creator_and_buyer() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = env.register(CreatorKeysContract, ()); + let client = CreatorKeysContractClient::new(&env, &contract_id); + + let admin = soroban_sdk::Address::generate(&env); + let creator = soroban_sdk::Address::generate(&env); + let buyer = soroban_sdk::Address::generate(&env); + + client.set_key_price(&admin, &100i128); + client.register_creator(&creator, &String::from_str(&env, "alice")); + client.buy_key(&creator, &buyer, &200i128); + + let events = env.events().all(); + let buy_event = events.last().unwrap(); + + // Topics: (symbol "buy", creator address, buyer address) + let topic_symbol: soroban_sdk::Symbol = buy_event.1.get(0).unwrap().into_val(&env); + let topic_creator: soroban_sdk::Address = buy_event.1.get(1).unwrap().into_val(&env); + let topic_buyer: soroban_sdk::Address = buy_event.1.get(2).unwrap().into_val(&env); + + assert_eq!(topic_symbol, symbol_short!("buy")); + assert_eq!(topic_creator, creator); + assert_eq!(topic_buyer, buyer); +} diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 5896df9..4f12f0d 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -96,19 +96,21 @@ fn test_buy_key_event_data_is_new_supply() { client.register_creator(&creator, &String::from_str(&env, "alice")); - // First buy → supply = 1 + // First buy → supply = 1, payment = 100 client.buy_key(&creator, &buyer1, &100_i128); let events = env.events().all(); let (_, _, data) = events.last().unwrap(); - let supply: u32 = data.into_val(&env); + let (supply, payment): (u32, i128) = data.into_val(&env); assert_eq!(supply, 1); + assert_eq!(payment, 100); - // Second buy → supply = 2 + // Second buy → supply = 2, payment = 100 client.buy_key(&creator, &buyer2, &100_i128); let events = env.events().all(); let (_, _, data) = events.last().unwrap(); - let supply: u32 = data.into_val(&env); + let (supply, payment): (u32, i128) = data.into_val(&env); assert_eq!(supply, 2); + assert_eq!(payment, 100); } #[test]