From 7ad211317fe04d80c1257f3dbcd8b389ba589cb1 Mon Sep 17 00:00:00 2001 From: Alex Benjamin Date: Wed, 17 Jun 2026 22:14:10 +0000 Subject: [PATCH 1/6] Added optional max supply cap per creator at registration to enable enforced key scarcity --- creator-keys/src/lib.rs | 42 ++ creator-keys/src/test.rs | 36 +- ...invariant_100_creator_zero_protocol.1.json | 3 +- ...e_split_invariant_50_50_equal_split.1.json | 3 +- ..._split_invariant_90_10_nominal_case.1.json | 3 +- ...variant_across_multiple_fee_configs.1.json | 12 +- ..._split_invariant_across_price_range.1.json | 30 +- ...it_invariant_boundary_odd_price_999.1.json | 3 +- ..._split_invariant_boundary_price_one.1.json | 3 +- ..._split_invariant_boundary_price_two.1.json | 3 +- ..._invariant_deterministic_assertions.1.json | 3 +- ...ll_fee_split_invariant_large_amount.1.json | 3 +- ...t_invariant_max_protocol_50_percent.1.json | 3 +- ...e_split_invariant_zero_net_boundary.1.json | 12 +- ..._net_is_zero_fees_absorb_full_price.1.json | 3 +- ...0_50_price_ten_equal_split_zero_net.1.json | 3 +- ...ice_protocol_takes_first_floor_unit.1.json | 3 +- ...ne_all_creator_no_protocol_rounding.1.json | 3 +- ...favors_creator_on_indivisible_price.1.json | 3 +- ...price_floors_protocol_share_to_zero.1.json | 3 +- ...vent_topic_and_data_order_is_stable.1.json | 3 +- .../test_buy_key_insufficient_payment.1.json | 3 +- .../test/test_buy_key_success.1.json | 3 +- .../test_duplicate_registration_fails.1.json | 3 +- .../test/test_get_buy_quote_success.1.json | 3 +- ...t_get_creator_fee_recipient_success.1.json | 3 +- ..._holder_count_counts_unique_holders.1.json | 3 +- ...nfig_persists_across_repeated_reads.1.json | 3 +- ...eturns_zero_for_unregistered_wallet.1.json | 3 +- ...test_get_quote_fails_if_fee_not_set.1.json | 3 +- ...quote_fails_if_insufficient_balance.1.json | 3 +- .../test/test_get_sell_quote_success.1.json | 3 +- .../test/test_quote_overflow_guards.1.json | 3 +- .../test/test_register_creator.1.json | 3 +- ...ator_persists_registration_metadata.1.json | 3 +- ...o_and_ordered_after_identity_fields.1.json | 3 +- ...egister_event_field_order_is_stable.1.json | 3 +- ...tches_rejects_unexpected_identifier.1.json | 374 +++++++++ ...key_emits_event_with_correct_topics.1.json | 3 +- ...st_buy_key_event_data_is_new_supply.1.json | 3 +- ...y_key_event_includes_payment_amount.1.json | 3 +- ...uy_key_event_present_after_purchase.1.json | 3 +- ...nt_topics_include_creator_and_buyer.1.json | 3 +- ..._buy_key_insufficient_payment_fails.1.json | 3 +- ...test_buy_key_negative_payment_fails.1.json | 3 +- ...t_buy_key_positive_payment_succeeds.1.json | 3 +- ...buy_key_sufficient_payment_succeeds.1.json | 3 +- ...key_with_large_safe_amount_succeeds.1.json | 3 +- ...key_with_maximum_safe_i128_succeeds.1.json | 3 +- .../test_buy_key_zero_payment_fails.1.json | 3 +- ...istic_across_zero_supply_transition.1.json | 3 +- ...quote_fees_sum_to_total_minus_price.1.json | 3 +- ..._identical_across_consecutive_calls.1.json | 3 +- ...ote_monotonic_with_zero_creator_fee.1.json | 3 +- ...te_monotonic_with_zero_protocol_fee.1.json | 3 +- ...e_creators_independent_monotonicity.1.json | 6 +- ...t_buy_quote_price_point_1_is_stable.1.json | 3 +- ...y_quote_price_point_large_is_stable.1.json | 3 +- ..._across_multiple_buyers_small_range.1.json | 3 +- ...ote_price_unchanged_after_five_buys.1.json | 3 +- ...quote_price_unchanged_after_one_buy.1.json | 3 +- ...able_across_50_sequential_purchases.1.json | 3 +- ...e_stable_over_medium_volume_20_buys.1.json | 3 +- ...uote_total_amount_never_below_price.1.json | 3 +- ...dering_is_deterministic_small_range.1.json | 3 +- ...e_updates_after_fee_config_mutation.1.json | 3 +- ...uy_quote_with_large_amount_succeeds.1.json | 3 +- ...mum_safe_amount_50_50_fees_succeeds.1.json | 3 +- ...e_with_maximum_safe_amount_succeeds.1.json | 3 +- .../test_capped_buy_at_limit_succeeds.1.json | 635 ++++++++++++++++ ...ped_buy_exceeding_limit_is_rejected.1.json | 599 +++++++++++++++ ...one_key_cap_then_exceed_is_rejected.1.json | 477 ++++++++++++ ...st_capped_buy_within_limit_succeeds.1.json | 574 ++++++++++++++ ...uote_zero_amount_returns_noop_quote.1.json | 3 +- ...ts_latest_state_after_buy_then_sell.1.json | 3 +- ...ils_registered_returns_correct_data.1.json | 3 +- ...t_creator_details_updates_after_buy.1.json | 3 +- ...st_get_creator_fee_bps_is_read_only.1.json | 3 +- ...or_fee_bps_returns_configured_value.1.json | 3 +- ...r_fee_bps_tracks_fee_config_updates.1.json | 391 ++++++++++ ...get_creator_fee_config_is_read_only.1.json | 3 +- ...onfig_multiple_creators_independent.1.json | 6 +- ...fee_config_registered_no_fee_config.1.json | 3 +- ...e_config_registered_with_fee_config.1.json | 3 +- ...g_updates_after_fee_reconfiguration.1.json | 3 +- ..._creator_fee_recipient_is_read_only.1.json | 3 +- ...e_recipient_returns_creator_address.1.json | 3 +- ...est_get_creator_supply_is_read_only.1.json | 3 +- ...eator_supply_returns_current_supply.1.json | 3 +- ...creator_treasury_share_is_read_only.1.json | 3 +- ...sury_share_returns_configured_value.1.json | 3 +- ...decimals_stable_after_state_changes.1.json | 3 +- .../test_get_key_name_success.1.json | 3 +- .../test_get_key_symbol_success.1.json | 3 +- ...pply_returns_cap_for_capped_creator.1.json | 265 +++++++ ...y_returns_none_for_uncapped_creator.1.json | 218 ++++++ ..._version_stable_after_state_changes.1.json | 3 +- ...uote_zero_amount_returns_noop_quote.1.json | 3 +- ...tal_key_supply_increments_after_buy.1.json | 3 +- ...t_get_total_key_supply_is_read_only.1.json | 3 +- ...supply_returns_zero_for_new_creator.1.json | 3 +- ...ount_reflects_mixed_trade_correctly.1.json | 3 +- ...ro_after_last_holder_exit_and_rebuy.1.json | 548 ++++++++++++++ ...nchanged_when_holder_still_has_keys.1.json | 3 +- ...ew_consistency_with_get_key_balance.1.json | 3 +- ...er_key_count_view_increments_on_buy.1.json | 3 +- ...der_key_count_view_multiple_holders.1.json | 3 +- ...er_key_count_view_no_state_mutation.1.json | 3 +- ...ew_registered_creator_unseen_wallet.1.json | 3 +- ...older_key_count_view_starts_at_zero.1.json | 3 +- ...der_key_count_view_structure_fields.1.json | 3 +- ...t_view_zero_keys_different_creators.1.json | 6 +- ...ered_different_creators_independent.1.json | 3 +- ..._is_creator_registered_is_read_only.1.json | 3 +- ...red_returns_true_after_registration.1.json | 3 +- .../test_key_balance_increments_on_buy.1.json | 3 +- .../test_key_balance_is_per_buyer.1.json | 3 +- .../test_key_balance_is_per_creator.1.json | 6 +- ...egistered_creator_and_unseen_wallet.1.json | 3 +- ...ator_even_when_other_balances_exist.1.json | 3 +- ...est_max_supply_is_stable_after_buys.1.json | 538 +++++++++++++ ...r_creator_accepts_max_handle_length.1.json | 3 +- ...r_creator_accepts_min_handle_length.1.json | 3 +- ...reator_different_addresses_succeeds.1.json | 6 +- ...or_duplicate_different_handle_fails.1.json | 3 +- ...st_register_creator_duplicate_fails.1.json | 3 +- .../test_register_creator_emits_event.1.json | 3 +- ...ator_event_data_is_indexer_friendly.1.json | 3 +- ...t_register_creator_event_fires_once.1.json | 3 +- ...reator_handle_one_over_max_rejected.1.json | 76 ++ ..._creator_max_length_handle_succeeds.1.json | 218 ++++++ ...istration_with_zero_cap_is_rejected.1.json | 76 ++ ...o_amount_quote_calls_no_state_drift.1.json | 3 +- ...uy_succeeds_without_underflow_error.1.json | 3 +- ..._full_exit_then_rebuy_updates_state.1.json | 3 +- ...l_key_decrements_supply_and_balance.1.json | 3 +- ...l_key_fails_when_seller_has_no_keys.1.json | 3 +- ...er_count_when_seller_still_has_keys.1.json | 3 +- ...emoves_holder_when_last_key_is_sold.1.json | 3 +- ...ll_quote_with_large_amount_succeeds.1.json | 3 +- ...mum_safe_amount_50_50_fees_succeeds.1.json | 3 +- ...e_with_maximum_safe_amount_succeeds.1.json | 3 +- ...te_zero_supply_boundary_is_rejected.1.json | 3 +- ...g_last_returns_insufficient_balance.1.json | 3 +- ...ys_succeeds_without_underflow_error.1.json | 3 +- ...o_keys_returns_insufficient_balance.1.json | 3 +- ...t_supply_alternating_buys_and_sells.1.json | 3 +- ...ce_decremented_correctly_after_sell.1.json | 3 +- ...upply_buy_then_sell_returns_to_zero.1.json | 3 +- ...y_buy_two_sell_one_conserves_supply.1.json | 3 +- ...r_one_creator_do_not_affect_another.1.json | 6 +- ...ply_mixed_trades_three_participants.1.json | 3 +- ...le_buys_per_holder_sum_equals_total.1.json | 3 +- ...ver_goes_below_zero_after_all_sells.1.json | 3 +- ...upply_three_buyers_sum_equals_total.1.json | 3 +- ...uncapped_buy_succeeds_without_limit.1.json | 710 ++++++++++++++++++ creator-keys/tests/buy_key_event.rs | 4 +- creator-keys/tests/contract_test_env/mod.rs | 2 +- creator-keys/tests/creator_details_view.rs | 2 +- creator-keys/tests/creator_fee_bps.rs | 6 +- creator-keys/tests/creator_fee_config_view.rs | 12 +- creator-keys/tests/creator_fee_recipient.rs | 4 +- creator-keys/tests/creator_registration.rs | 32 +- creator-keys/tests/creator_supply.rs | 2 +- creator-keys/tests/creator_treasury_share.rs | 4 +- creator-keys/tests/events.rs | 14 +- creator-keys/tests/holder_key_count_view.rs | 6 +- creator-keys/tests/key_balance.rs | 12 +- creator-keys/tests/key_decimals.rs | 2 +- creator-keys/tests/key_name.rs | 2 +- creator-keys/tests/key_supply.rs | 12 +- creator-keys/tests/key_symbol.rs | 2 +- creator-keys/tests/protocol_state_version.rs | 2 +- creator-keys/tests/supply_cap.rs | 167 ++++ 174 files changed, 6308 insertions(+), 239 deletions(-) create mode 100644 creator-keys/test_snapshots/test_assert_event_topic_matches_rejects_unexpected_identifier.1.json create mode 100644 creator-keys/test_snapshots/test_capped_buy_at_limit_succeeds.1.json create mode 100644 creator-keys/test_snapshots/test_capped_buy_exceeding_limit_is_rejected.1.json create mode 100644 creator-keys/test_snapshots/test_capped_buy_one_key_cap_then_exceed_is_rejected.1.json create mode 100644 creator-keys/test_snapshots/test_capped_buy_within_limit_succeeds.1.json create mode 100644 creator-keys/test_snapshots/test_get_creator_fee_bps_tracks_fee_config_updates.1.json create mode 100644 creator-keys/test_snapshots/test_get_max_supply_returns_cap_for_capped_creator.1.json create mode 100644 creator-keys/test_snapshots/test_get_max_supply_returns_none_for_uncapped_creator.1.json create mode 100644 creator-keys/test_snapshots/test_holder_count_returns_to_zero_after_last_holder_exit_and_rebuy.1.json create mode 100644 creator-keys/test_snapshots/test_max_supply_is_stable_after_buys.1.json create mode 100644 creator-keys/test_snapshots/test_register_creator_handle_one_over_max_rejected.1.json create mode 100644 creator-keys/test_snapshots/test_register_creator_max_length_handle_succeeds.1.json create mode 100644 creator-keys/test_snapshots/test_registration_with_zero_cap_is_rejected.1.json create mode 100644 creator-keys/test_snapshots/test_uncapped_buy_succeeds_without_limit.1.json create mode 100644 creator-keys/tests/supply_cap.rs diff --git a/creator-keys/src/lib.rs b/creator-keys/src/lib.rs index f869998..15b4141 100644 --- a/creator-keys/src/lib.rs +++ b/creator-keys/src/lib.rs @@ -23,6 +23,8 @@ pub enum ContractError { HandleTooShort = 12, HandleTooLong = 13, InvalidHandleCharacter = 14, + SupplyCapExceeded = 15, + InvalidMaxSupply = 16, } pub mod fee { @@ -181,6 +183,10 @@ pub mod constants { pub fn key_balance(creator: &Address, holder: &Address) -> DataKey { key_balance_key(creator, holder) } + + pub fn max_supply(creator: &Address) -> DataKey { + DataKey::MaxSupply(creator.clone()) + } } fn creator_key(creator: &Address) -> DataKey { @@ -298,6 +304,7 @@ pub enum DataKey { TreasuryAddress, AdminAddress, ProtocolFeeRecipient, + MaxSupply(Address), } #[derive(Clone, Debug, PartialEq)] @@ -477,11 +484,18 @@ impl CreatorKeysContract { env: Env, creator: Address, handle: String, + max_supply: Option, ) -> Result<(), ContractError> { creator.require_auth(); validate_creator_handle(&handle)?; + if let Some(cap) = max_supply { + if cap == 0 { + return Err(ContractError::InvalidMaxSupply); + } + } + let key = constants::storage::creator(&creator); // Creator profile storage is a single source of truth keyed by creator address. // Once written, this key's existence is the registration invariant. @@ -505,6 +519,13 @@ impl CreatorKeysContract { // Persist profile before event publication so indexers reading contract state // after this tx observe the same registration payload that was emitted. env.storage().persistent().set(&key, &profile); + + if let Some(cap) = max_supply { + env.storage() + .persistent() + .set(&constants::storage::max_supply(&creator), &cap); + } + env.events().publish( events::register_event_topics(&profile.creator), events::CreatorRegisteredEvent { @@ -544,6 +565,18 @@ impl CreatorKeysContract { let mut profile: CreatorProfile = read_registered_creator_profile(&env, &creator)?; + // Enforce supply cap if one was set at registration. + let cap_key = constants::storage::max_supply(&creator); + if let Some(cap) = env + .storage() + .persistent() + .get::(&cap_key) + { + if profile.supply >= cap { + return Err(ContractError::SupplyCapExceeded); + } + } + let balance_key = constants::storage::key_balance(&creator, &buyer); // Missing balance entries are treated as zero to keep storage sparse. let current_balance: u32 = env.storage().persistent().get(&balance_key).unwrap_or(0); @@ -722,6 +755,15 @@ impl CreatorKeysContract { Ok(profile.supply) } + /// Read-only view: returns the max supply cap for a creator, or `None` if uncapped. + /// + /// The cap is immutable after registration. Returns `None` for unregistered creators. + pub fn get_max_supply(env: Env, creator: Address) -> Option { + env.storage() + .persistent() + .get(&constants::storage::max_supply(&creator)) + } + /// Read-only view: returns the number of unique holders for a creator. /// /// Returns `0` if the creator is not registered, avoiding panics for diff --git a/creator-keys/src/test.rs b/creator-keys/src/test.rs index 3f20929..8748861 100644 --- a/creator-keys/src/test.rs +++ b/creator-keys/src/test.rs @@ -120,7 +120,7 @@ fn test_get_fee_config_persists_across_repeated_reads() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // Repeatedly read the fee config and verify stability for _ in 0..5 { @@ -146,7 +146,7 @@ fn test_register_creator() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let profile = client.get_creator(&creator); assert_eq!(profile.handle, handle); @@ -166,7 +166,7 @@ fn test_register_creator_persists_registration_metadata() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let profile = client.get_creator(&creator); assert_eq!(profile.creator, creator); @@ -186,10 +186,10 @@ fn test_duplicate_registration_fails() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // Second registration should fail with AlreadyRegistered error - let result = client.try_register_creator(&creator, &handle); + let result = client.try_register_creator(&creator, &handle, &None); assert_eq!(result, Err(Ok(ContractError::AlreadyRegistered))); } @@ -222,7 +222,7 @@ fn test_buy_key_success() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let buyer = Address::generate(&env); let supply = client.buy_key(&creator, &buyer, &100); @@ -245,7 +245,7 @@ fn test_get_creator_holder_count_counts_unique_holders() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let holder_one = Address::generate(&env); let holder_two = Address::generate(&env); @@ -286,7 +286,7 @@ fn test_buy_key_insufficient_payment() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let buyer = Address::generate(&env); let result = client.try_buy_key(&creator, &buyer, &99); @@ -354,7 +354,7 @@ fn test_get_key_balance_returns_zero_for_unregistered_wallet() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let unregistered_wallet = Address::generate(&env); @@ -432,7 +432,7 @@ fn test_get_buy_quote_success() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let quote = client.get_buy_quote(&creator); assert_eq!(quote.price, 1000); @@ -454,7 +454,7 @@ fn test_get_sell_quote_success() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let buyer = Address::generate(&env); client.buy_key(&creator, &buyer, &1000); @@ -479,7 +479,7 @@ fn test_get_sell_quote_fails_if_insufficient_balance() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let holder = Address::generate(&env); // Zero balance let result = client.try_get_sell_quote(&creator, &holder); @@ -514,7 +514,7 @@ fn test_get_quote_fails_if_fee_not_set() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let result = client.try_get_buy_quote(&creator); assert_eq!(result, Err(Ok(ContractError::FeeConfigNotSet))); @@ -544,7 +544,7 @@ fn test_get_creator_fee_recipient_success() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let recipient = client.get_creator_fee_recipient(&creator); assert_eq!(recipient, creator); @@ -576,7 +576,7 @@ fn test_quote_overflow_guards() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // Buy quote: price + fees (will overflow) let result = client.try_get_buy_quote(&creator); @@ -653,7 +653,7 @@ fn test_register_event_field_order_is_stable() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let all_events = env.events().all(); assert_eq!( @@ -715,7 +715,7 @@ fn test_buy_event_topic_and_data_order_is_stable() { let creator = Address::generate(&env); let handle = String::from_str(&env, "bob"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let buyer = Address::generate(&env); client.buy_key(&creator, &buyer, &500); @@ -781,7 +781,7 @@ fn test_register_event_fee_adjacent_fields_are_zero_and_ordered_after_identity_f let creator = Address::generate(&env); let handle = String::from_str(&env, "carol"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let all_events = env.events().all(); let (_contract_id, _topics, data): ( diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_100_creator_zero_protocol.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_100_creator_zero_protocol.1.json index 8b35a84..abf6347 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_100_creator_zero_protocol.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_100_creator_zero_protocol.1.json @@ -69,7 +69,8 @@ }, { "string": "creator3" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_50_50_equal_split.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_50_50_equal_split.1.json index 23dbd3d..8235e39 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_50_50_equal_split.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_50_50_equal_split.1.json @@ -69,7 +69,8 @@ }, { "string": "creator2" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_90_10_nominal_case.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_90_10_nominal_case.1.json index 5a149eb..16b96fc 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_90_10_nominal_case.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_90_10_nominal_case.1.json @@ -69,7 +69,8 @@ }, { "string": "creator1" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_across_multiple_fee_configs.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_across_multiple_fee_configs.1.json index b162552..a7db3b3 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_across_multiple_fee_configs.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_across_multiple_fee_configs.1.json @@ -19,7 +19,8 @@ }, { "string": "creator0" - } + }, + "void" ] } }, @@ -121,7 +122,8 @@ }, { "string": "creator1" - } + }, + "void" ] } }, @@ -223,7 +225,8 @@ }, { "string": "creator2" - } + }, + "void" ] } }, @@ -325,7 +328,8 @@ }, { "string": "creator3" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_across_price_range.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_across_price_range.1.json index 79347a8..a20a49c 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_across_price_range.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_across_price_range.1.json @@ -19,7 +19,8 @@ }, { "string": "creator0" - } + }, + "void" ] } }, @@ -121,7 +122,8 @@ }, { "string": "creator1" - } + }, + "void" ] } }, @@ -223,7 +225,8 @@ }, { "string": "creator2" - } + }, + "void" ] } }, @@ -325,7 +328,8 @@ }, { "string": "creator3" - } + }, + "void" ] } }, @@ -427,7 +431,8 @@ }, { "string": "creator4" - } + }, + "void" ] } }, @@ -529,7 +534,8 @@ }, { "string": "creator5" - } + }, + "void" ] } }, @@ -631,7 +637,8 @@ }, { "string": "creator6" - } + }, + "void" ] } }, @@ -733,7 +740,8 @@ }, { "string": "creator7" - } + }, + "void" ] } }, @@ -835,7 +843,8 @@ }, { "string": "creator8" - } + }, + "void" ] } }, @@ -937,7 +946,8 @@ }, { "string": "creator9" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_odd_price_999.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_odd_price_999.1.json index d7d84f6..826a47a 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_odd_price_999.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_odd_price_999.1.json @@ -69,7 +69,8 @@ }, { "string": "creator7" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_one.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_one.1.json index 0df271e..a10d692 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_one.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_one.1.json @@ -69,7 +69,8 @@ }, { "string": "creator5" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_two.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_two.1.json index 277dfe1..6f544c7 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_two.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_boundary_price_two.1.json @@ -69,7 +69,8 @@ }, { "string": "creator6" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_deterministic_assertions.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_deterministic_assertions.1.json index c9d32ad..a53b981 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_deterministic_assertions.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_deterministic_assertions.1.json @@ -69,7 +69,8 @@ }, { "string": "creator_det" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_large_amount.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_large_amount.1.json index 797e5de..2db1dce 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_large_amount.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_large_amount.1.json @@ -69,7 +69,8 @@ }, { "string": "creator8" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_max_protocol_50_percent.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_max_protocol_50_percent.1.json index bf543cd..13697b5 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_max_protocol_50_percent.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_max_protocol_50_percent.1.json @@ -69,7 +69,8 @@ }, { "string": "creator4" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_fee_split_invariant_zero_net_boundary.1.json b/creator-keys/test_snapshots/sell_fee_split_invariant_zero_net_boundary.1.json index eb41d2e..d66382e 100644 --- a/creator-keys/test_snapshots/sell_fee_split_invariant_zero_net_boundary.1.json +++ b/creator-keys/test_snapshots/sell_fee_split_invariant_zero_net_boundary.1.json @@ -19,7 +19,8 @@ }, { "string": "creator0" - } + }, + "void" ] } }, @@ -122,7 +123,8 @@ }, { "string": "creator1" - } + }, + "void" ] } }, @@ -225,7 +227,8 @@ }, { "string": "creator2" - } + }, + "void" ] } }, @@ -328,7 +331,8 @@ }, { "string": "creator3" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_quote_100_percent_creator_seller_net_is_zero_fees_absorb_full_price.1.json b/creator-keys/test_snapshots/sell_quote_100_percent_creator_seller_net_is_zero_fees_absorb_full_price.1.json index 91c0476..9341bbe 100644 --- a/creator-keys/test_snapshots/sell_quote_100_percent_creator_seller_net_is_zero_fees_absorb_full_price.1.json +++ b/creator-keys/test_snapshots/sell_quote_100_percent_creator_seller_net_is_zero_fees_absorb_full_price.1.json @@ -69,7 +69,8 @@ }, { "string": "cr5" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_quote_50_50_price_ten_equal_split_zero_net.1.json b/creator-keys/test_snapshots/sell_quote_50_50_price_ten_equal_split_zero_net.1.json index 3a850ce..984da27 100644 --- a/creator-keys/test_snapshots/sell_quote_50_50_price_ten_equal_split_zero_net.1.json +++ b/creator-keys/test_snapshots/sell_quote_50_50_price_ten_equal_split_zero_net.1.json @@ -69,7 +69,8 @@ }, { "string": "cr4" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_quote_50_50_small_price_protocol_takes_first_floor_unit.1.json b/creator-keys/test_snapshots/sell_quote_50_50_small_price_protocol_takes_first_floor_unit.1.json index 7e2b833..67d9081 100644 --- a/creator-keys/test_snapshots/sell_quote_50_50_small_price_protocol_takes_first_floor_unit.1.json +++ b/creator-keys/test_snapshots/sell_quote_50_50_small_price_protocol_takes_first_floor_unit.1.json @@ -69,7 +69,8 @@ }, { "string": "cr3" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_quote_90_10_dust_price_one_all_creator_no_protocol_rounding.1.json b/creator-keys/test_snapshots/sell_quote_90_10_dust_price_one_all_creator_no_protocol_rounding.1.json index 0c1fb2e..f9138f3 100644 --- a/creator-keys/test_snapshots/sell_quote_90_10_dust_price_one_all_creator_no_protocol_rounding.1.json +++ b/creator-keys/test_snapshots/sell_quote_90_10_dust_price_one_all_creator_no_protocol_rounding.1.json @@ -69,7 +69,8 @@ }, { "string": "cr2" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_quote_90_10_remainder_favors_creator_on_indivisible_price.1.json b/creator-keys/test_snapshots/sell_quote_90_10_remainder_favors_creator_on_indivisible_price.1.json index d091f58..36bb04d 100644 --- a/creator-keys/test_snapshots/sell_quote_90_10_remainder_favors_creator_on_indivisible_price.1.json +++ b/creator-keys/test_snapshots/sell_quote_90_10_remainder_favors_creator_on_indivisible_price.1.json @@ -69,7 +69,8 @@ }, { "string": "cr1" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/sell_quote_max_allowed_protocol_bps_50_50_dust_price_floors_protocol_share_to_zero.1.json b/creator-keys/test_snapshots/sell_quote_max_allowed_protocol_bps_50_50_dust_price_floors_protocol_share_to_zero.1.json index 290539f..3b870eb 100644 --- a/creator-keys/test_snapshots/sell_quote_max_allowed_protocol_bps_50_50_dust_price_floors_protocol_share_to_zero.1.json +++ b/creator-keys/test_snapshots/sell_quote_max_allowed_protocol_bps_50_50_dust_price_floors_protocol_share_to_zero.1.json @@ -69,7 +69,8 @@ }, { "string": "cr6" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_buy_event_topic_and_data_order_is_stable.1.json b/creator-keys/test_snapshots/test/test_buy_event_topic_and_data_order_is_stable.1.json index 2649e79..aa5c2f1 100644 --- a/creator-keys/test_snapshots/test/test_buy_event_topic_and_data_order_is_stable.1.json +++ b/creator-keys/test_snapshots/test/test_buy_event_topic_and_data_order_is_stable.1.json @@ -69,7 +69,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_buy_key_insufficient_payment.1.json b/creator-keys/test_snapshots/test/test_buy_key_insufficient_payment.1.json index 3fbbbf8..7779835 100644 --- a/creator-keys/test_snapshots/test/test_buy_key_insufficient_payment.1.json +++ b/creator-keys/test_snapshots/test/test_buy_key_insufficient_payment.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_buy_key_success.1.json b/creator-keys/test_snapshots/test/test_buy_key_success.1.json index d79e29e..44bbc9c 100644 --- a/creator-keys/test_snapshots/test/test_buy_key_success.1.json +++ b/creator-keys/test_snapshots/test/test_buy_key_success.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_duplicate_registration_fails.1.json b/creator-keys/test_snapshots/test/test_duplicate_registration_fails.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test/test_duplicate_registration_fails.1.json +++ b/creator-keys/test_snapshots/test/test_duplicate_registration_fails.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_buy_quote_success.1.json b/creator-keys/test_snapshots/test/test_get_buy_quote_success.1.json index c12eb38..f21ad92 100644 --- a/creator-keys/test_snapshots/test/test_get_buy_quote_success.1.json +++ b/creator-keys/test_snapshots/test/test_get_buy_quote_success.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_creator_fee_recipient_success.1.json b/creator-keys/test_snapshots/test/test_get_creator_fee_recipient_success.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test/test_get_creator_fee_recipient_success.1.json +++ b/creator-keys/test_snapshots/test/test_get_creator_fee_recipient_success.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_creator_holder_count_counts_unique_holders.1.json b/creator-keys/test_snapshots/test/test_get_creator_holder_count_counts_unique_holders.1.json index 02f10f2..10b7952 100644 --- a/creator-keys/test_snapshots/test/test_get_creator_holder_count_counts_unique_holders.1.json +++ b/creator-keys/test_snapshots/test/test_get_creator_holder_count_counts_unique_holders.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_fee_config_persists_across_repeated_reads.1.json b/creator-keys/test_snapshots/test/test_get_fee_config_persists_across_repeated_reads.1.json index 58eeea8..e2c1775 100644 --- a/creator-keys/test_snapshots/test/test_get_fee_config_persists_across_repeated_reads.1.json +++ b/creator-keys/test_snapshots/test/test_get_fee_config_persists_across_repeated_reads.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_key_balance_returns_zero_for_unregistered_wallet.1.json b/creator-keys/test_snapshots/test/test_get_key_balance_returns_zero_for_unregistered_wallet.1.json index f659b6e..94afd1e 100644 --- a/creator-keys/test_snapshots/test/test_get_key_balance_returns_zero_for_unregistered_wallet.1.json +++ b/creator-keys/test_snapshots/test/test_get_key_balance_returns_zero_for_unregistered_wallet.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_quote_fails_if_fee_not_set.1.json b/creator-keys/test_snapshots/test/test_get_quote_fails_if_fee_not_set.1.json index d6ba4c9..7e0a34a 100644 --- a/creator-keys/test_snapshots/test/test_get_quote_fails_if_fee_not_set.1.json +++ b/creator-keys/test_snapshots/test/test_get_quote_fails_if_fee_not_set.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_sell_quote_fails_if_insufficient_balance.1.json b/creator-keys/test_snapshots/test/test_get_sell_quote_fails_if_insufficient_balance.1.json index e46b311..8da6df2 100644 --- a/creator-keys/test_snapshots/test/test_get_sell_quote_fails_if_insufficient_balance.1.json +++ b/creator-keys/test_snapshots/test/test_get_sell_quote_fails_if_insufficient_balance.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_get_sell_quote_success.1.json b/creator-keys/test_snapshots/test/test_get_sell_quote_success.1.json index ff393f5..a08073e 100644 --- a/creator-keys/test_snapshots/test/test_get_sell_quote_success.1.json +++ b/creator-keys/test_snapshots/test/test_get_sell_quote_success.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_quote_overflow_guards.1.json b/creator-keys/test_snapshots/test/test_quote_overflow_guards.1.json index b277bdd..3a14758 100644 --- a/creator-keys/test_snapshots/test/test_quote_overflow_guards.1.json +++ b/creator-keys/test_snapshots/test/test_quote_overflow_guards.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_register_creator.1.json b/creator-keys/test_snapshots/test/test_register_creator.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test/test_register_creator.1.json +++ b/creator-keys/test_snapshots/test/test_register_creator.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_register_creator_persists_registration_metadata.1.json b/creator-keys/test_snapshots/test/test_register_creator_persists_registration_metadata.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test/test_register_creator_persists_registration_metadata.1.json +++ b/creator-keys/test_snapshots/test/test_register_creator_persists_registration_metadata.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_register_event_fee_adjacent_fields_are_zero_and_ordered_after_identity_fields.1.json b/creator-keys/test_snapshots/test/test_register_event_fee_adjacent_fields_are_zero_and_ordered_after_identity_fields.1.json index cc5df3a..ecb9ee7 100644 --- a/creator-keys/test_snapshots/test/test_register_event_fee_adjacent_fields_are_zero_and_ordered_after_identity_fields.1.json +++ b/creator-keys/test_snapshots/test/test_register_event_fee_adjacent_fields_are_zero_and_ordered_after_identity_fields.1.json @@ -19,7 +19,8 @@ }, { "string": "carol" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test/test_register_event_field_order_is_stable.1.json b/creator-keys/test_snapshots/test/test_register_event_field_order_is_stable.1.json index 96ed3d5..360ab80 100644 --- a/creator-keys/test_snapshots/test/test_register_event_field_order_is_stable.1.json +++ b/creator-keys/test_snapshots/test/test_register_event_field_order_is_stable.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_assert_event_topic_matches_rejects_unexpected_identifier.1.json b/creator-keys/test_snapshots/test_assert_event_topic_matches_rejects_unexpected_identifier.1.json new file mode 100644 index 0000000..397cd89 --- /dev/null +++ b/creator-keys/test_snapshots/test_assert_event_topic_matches_rejects_unexpected_identifier.1.json @@ -0,0 +1,374 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "register" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_buy_key_emits_event_with_correct_topics.1.json b/creator-keys/test_snapshots/test_buy_key_emits_event_with_correct_topics.1.json index 3beecb0..525f667 100644 --- a/creator-keys/test_snapshots/test_buy_key_emits_event_with_correct_topics.1.json +++ b/creator-keys/test_snapshots/test_buy_key_emits_event_with_correct_topics.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_event_data_is_new_supply.1.json b/creator-keys/test_snapshots/test_buy_key_event_data_is_new_supply.1.json index 205918d..fe5293f 100644 --- a/creator-keys/test_snapshots/test_buy_key_event_data_is_new_supply.1.json +++ b/creator-keys/test_snapshots/test_buy_key_event_data_is_new_supply.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_event_includes_payment_amount.1.json b/creator-keys/test_snapshots/test_buy_key_event_includes_payment_amount.1.json index 359e55e..fbe1258 100644 --- a/creator-keys/test_snapshots/test_buy_key_event_includes_payment_amount.1.json +++ b/creator-keys/test_snapshots/test_buy_key_event_includes_payment_amount.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_event_present_after_purchase.1.json b/creator-keys/test_snapshots/test_buy_key_event_present_after_purchase.1.json index 3beecb0..525f667 100644 --- a/creator-keys/test_snapshots/test_buy_key_event_present_after_purchase.1.json +++ b/creator-keys/test_snapshots/test_buy_key_event_present_after_purchase.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_event_topics_include_creator_and_buyer.1.json b/creator-keys/test_snapshots/test_buy_key_event_topics_include_creator_and_buyer.1.json index b20abf4..1a45078 100644 --- a/creator-keys/test_snapshots/test_buy_key_event_topics_include_creator_and_buyer.1.json +++ b/creator-keys/test_snapshots/test_buy_key_event_topics_include_creator_and_buyer.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_insufficient_payment_fails.1.json b/creator-keys/test_snapshots/test_buy_key_insufficient_payment_fails.1.json index 3fbbbf8..7779835 100644 --- a/creator-keys/test_snapshots/test_buy_key_insufficient_payment_fails.1.json +++ b/creator-keys/test_snapshots/test_buy_key_insufficient_payment_fails.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_negative_payment_fails.1.json b/creator-keys/test_snapshots/test_buy_key_negative_payment_fails.1.json index 3fbbbf8..7779835 100644 --- a/creator-keys/test_snapshots/test_buy_key_negative_payment_fails.1.json +++ b/creator-keys/test_snapshots/test_buy_key_negative_payment_fails.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_positive_payment_succeeds.1.json b/creator-keys/test_snapshots/test_buy_key_positive_payment_succeeds.1.json index 3beecb0..525f667 100644 --- a/creator-keys/test_snapshots/test_buy_key_positive_payment_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_key_positive_payment_succeeds.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_sufficient_payment_succeeds.1.json b/creator-keys/test_snapshots/test_buy_key_sufficient_payment_succeeds.1.json index d79e29e..44bbc9c 100644 --- a/creator-keys/test_snapshots/test_buy_key_sufficient_payment_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_key_sufficient_payment_succeeds.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_with_large_safe_amount_succeeds.1.json b/creator-keys/test_snapshots/test_buy_key_with_large_safe_amount_succeeds.1.json index 751e553..9677323 100644 --- a/creator-keys/test_snapshots/test_buy_key_with_large_safe_amount_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_key_with_large_safe_amount_succeeds.1.json @@ -20,7 +20,8 @@ }, { "string": "creator1" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_with_maximum_safe_i128_succeeds.1.json b/creator-keys/test_snapshots/test_buy_key_with_maximum_safe_i128_succeeds.1.json index 3f1318b..a1934e7 100644 --- a/creator-keys/test_snapshots/test_buy_key_with_maximum_safe_i128_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_key_with_maximum_safe_i128_succeeds.1.json @@ -20,7 +20,8 @@ }, { "string": "creator2" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_key_zero_payment_fails.1.json b/creator-keys/test_snapshots/test_buy_key_zero_payment_fails.1.json index 3fbbbf8..7779835 100644 --- a/creator-keys/test_snapshots/test_buy_key_zero_payment_fails.1.json +++ b/creator-keys/test_snapshots/test_buy_key_zero_payment_fails.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_deterministic_across_zero_supply_transition.1.json b/creator-keys/test_snapshots/test_buy_quote_deterministic_across_zero_supply_transition.1.json index cbc74d7..dfcb4e2 100644 --- a/creator-keys/test_snapshots/test_buy_quote_deterministic_across_zero_supply_transition.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_deterministic_across_zero_supply_transition.1.json @@ -69,7 +69,8 @@ }, { "string": "edge1" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_fees_sum_to_total_minus_price.1.json b/creator-keys/test_snapshots/test_buy_quote_fees_sum_to_total_minus_price.1.json index 73c4176..ec6513a 100644 --- a/creator-keys/test_snapshots/test_buy_quote_fees_sum_to_total_minus_price.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_fees_sum_to_total_minus_price.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_is_identical_across_consecutive_calls.1.json b/creator-keys/test_snapshots/test_buy_quote_is_identical_across_consecutive_calls.1.json index a0bcb7c..f4ea51d 100644 --- a/creator-keys/test_snapshots/test_buy_quote_is_identical_across_consecutive_calls.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_is_identical_across_consecutive_calls.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_creator_fee.1.json b/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_creator_fee.1.json index 661ef39..3bacd57 100644 --- a/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_creator_fee.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_creator_fee.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_protocol_fee.1.json b/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_protocol_fee.1.json index 993b6c0..6948f66 100644 --- a/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_protocol_fee.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_monotonic_with_zero_protocol_fee.1.json @@ -69,7 +69,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_multiple_creators_independent_monotonicity.1.json b/creator-keys/test_snapshots/test_buy_quote_multiple_creators_independent_monotonicity.1.json index a9b7256..0f34049 100644 --- a/creator-keys/test_snapshots/test_buy_quote_multiple_creators_independent_monotonicity.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_multiple_creators_independent_monotonicity.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, @@ -91,7 +92,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_price_point_1_is_stable.1.json b/creator-keys/test_snapshots/test_buy_quote_price_point_1_is_stable.1.json index c9f95da..c568719 100644 --- a/creator-keys/test_snapshots/test_buy_quote_price_point_1_is_stable.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_price_point_1_is_stable.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_price_point_large_is_stable.1.json b/creator-keys/test_snapshots/test_buy_quote_price_point_large_is_stable.1.json index 2323fa3..4f08132 100644 --- a/creator-keys/test_snapshots/test_buy_quote_price_point_large_is_stable.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_price_point_large_is_stable.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_price_unchanged_across_multiple_buyers_small_range.1.json b/creator-keys/test_snapshots/test_buy_quote_price_unchanged_across_multiple_buyers_small_range.1.json index e086508..537a992 100644 --- a/creator-keys/test_snapshots/test_buy_quote_price_unchanged_across_multiple_buyers_small_range.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_price_unchanged_across_multiple_buyers_small_range.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_five_buys.1.json b/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_five_buys.1.json index 96778fa..6d86a86 100644 --- a/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_five_buys.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_five_buys.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_one_buy.1.json b/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_one_buy.1.json index e96b37b..e21c430 100644 --- a/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_one_buy.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_price_unchanged_after_one_buy.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_stable_across_50_sequential_purchases.1.json b/creator-keys/test_snapshots/test_buy_quote_stable_across_50_sequential_purchases.1.json index b4910a1..c53b044 100644 --- a/creator-keys/test_snapshots/test_buy_quote_stable_across_50_sequential_purchases.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_stable_across_50_sequential_purchases.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_stable_over_medium_volume_20_buys.1.json b/creator-keys/test_snapshots/test_buy_quote_stable_over_medium_volume_20_buys.1.json index 9ef1865..141aac8 100644 --- a/creator-keys/test_snapshots/test_buy_quote_stable_over_medium_volume_20_buys.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_stable_over_medium_volume_20_buys.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_total_amount_never_below_price.1.json b/creator-keys/test_snapshots/test_buy_quote_total_amount_never_below_price.1.json index 79e869a..931edb1 100644 --- a/creator-keys/test_snapshots/test_buy_quote_total_amount_never_below_price.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_total_amount_never_below_price.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_total_amount_ordering_is_deterministic_small_range.1.json b/creator-keys/test_snapshots/test_buy_quote_total_amount_ordering_is_deterministic_small_range.1.json index 92b4a0b..a5ecdf4 100644 --- a/creator-keys/test_snapshots/test_buy_quote_total_amount_ordering_is_deterministic_small_range.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_total_amount_ordering_is_deterministic_small_range.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_updates_after_fee_config_mutation.1.json b/creator-keys/test_snapshots/test_buy_quote_updates_after_fee_config_mutation.1.json index 5eddbff..5efedf2 100644 --- a/creator-keys/test_snapshots/test_buy_quote_updates_after_fee_config_mutation.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_updates_after_fee_config_mutation.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_with_large_amount_succeeds.1.json b/creator-keys/test_snapshots/test_buy_quote_with_large_amount_succeeds.1.json index ea57bcf..2fa4e2c 100644 --- a/creator-keys/test_snapshots/test_buy_quote_with_large_amount_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_with_large_amount_succeeds.1.json @@ -45,7 +45,8 @@ }, { "string": "creator3" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json b/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json index cc0af2e..150b898 100644 --- a/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json @@ -45,7 +45,8 @@ }, { "string": "creator7" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_succeeds.1.json b/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_succeeds.1.json index f8d1646..7f8b84f 100644 --- a/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_succeeds.1.json +++ b/creator-keys/test_snapshots/test_buy_quote_with_maximum_safe_amount_succeeds.1.json @@ -45,7 +45,8 @@ }, { "string": "creator4" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_capped_buy_at_limit_succeeds.1.json b/creator-keys/test_snapshots/test_capped_buy_at_limit_succeeds.1.json new file mode 100644 index 0000000..6fef8d9 --- /dev/null +++ b/creator-keys/test_snapshots/test_capped_buy_at_limit_succeeds.1.json @@ -0,0 +1,635 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + { + "u32": 3 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 3 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "buy" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ], + "data": { + "vec": [ + { + "u32": 3 + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_capped_buy_exceeding_limit_is_rejected.1.json b/creator-keys/test_snapshots/test_capped_buy_exceeding_limit_is_rejected.1.json new file mode 100644 index 0000000..6ff53da --- /dev/null +++ b/creator-keys/test_snapshots/test_capped_buy_exceeding_limit_is_rejected.1.json @@ -0,0 +1,599 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + { + "u32": 3 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 3 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_capped_buy_one_key_cap_then_exceed_is_rejected.1.json b/creator-keys/test_snapshots/test_capped_buy_one_key_cap_then_exceed_is_rejected.1.json new file mode 100644 index 0000000..eb8aaa6 --- /dev/null +++ b/creator-keys/test_snapshots/test_capped_buy_one_key_cap_then_exceed_is_rejected.1.json @@ -0,0 +1,477 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 1 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_capped_buy_within_limit_succeeds.1.json b/creator-keys/test_snapshots/test_capped_buy_within_limit_succeeds.1.json new file mode 100644 index 0000000..8b56bfc --- /dev/null +++ b/creator-keys/test_snapshots/test_capped_buy_within_limit_succeeds.1.json @@ -0,0 +1,574 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + { + "u32": 3 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 2 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "buy" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ], + "data": { + "vec": [ + { + "u32": 2 + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_get_buy_quote_zero_amount_returns_noop_quote.1.json b/creator-keys/test_snapshots/test_get_buy_quote_zero_amount_returns_noop_quote.1.json index e490cf6..a842810 100644 --- a/creator-keys/test_snapshots/test_get_buy_quote_zero_amount_returns_noop_quote.1.json +++ b/creator-keys/test_snapshots/test_get_buy_quote_zero_amount_returns_noop_quote.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_details_reflects_latest_state_after_buy_then_sell.1.json b/creator-keys/test_snapshots/test_get_creator_details_reflects_latest_state_after_buy_then_sell.1.json index 55c8b0a..26d86d2 100644 --- a/creator-keys/test_snapshots/test_get_creator_details_reflects_latest_state_after_buy_then_sell.1.json +++ b/creator-keys/test_snapshots/test_get_creator_details_reflects_latest_state_after_buy_then_sell.1.json @@ -19,7 +19,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_details_registered_returns_correct_data.1.json b/creator-keys/test_snapshots/test_get_creator_details_registered_returns_correct_data.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_get_creator_details_registered_returns_correct_data.1.json +++ b/creator-keys/test_snapshots/test_get_creator_details_registered_returns_correct_data.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_details_updates_after_buy.1.json b/creator-keys/test_snapshots/test_get_creator_details_updates_after_buy.1.json index 9c6cd4e..e0940cc 100644 --- a/creator-keys/test_snapshots/test_get_creator_details_updates_after_buy.1.json +++ b/creator-keys/test_snapshots/test_get_creator_details_updates_after_buy.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_bps_is_read_only.1.json b/creator-keys/test_snapshots/test_get_creator_fee_bps_is_read_only.1.json index d5e4f25..05fd39c 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_bps_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_bps_is_read_only.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_bps_returns_configured_value.1.json b/creator-keys/test_snapshots/test_get_creator_fee_bps_returns_configured_value.1.json index 9fdbd84..7963a06 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_bps_returns_configured_value.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_bps_returns_configured_value.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_bps_tracks_fee_config_updates.1.json b/creator-keys/test_snapshots/test_get_creator_fee_bps_tracks_fee_config_updates.1.json new file mode 100644 index 0000000..159d143 --- /dev/null +++ b/creator-keys/test_snapshots/test_get_creator_fee_bps_tracks_fee_config_updates.1.json @@ -0,0 +1,391 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_fee_config", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 9000 + }, + { + "u32": 1000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_fee_config", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 7500 + }, + { + "u32": 2500 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "FeeConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "FeeConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator_bps" + }, + "val": { + "u32": 7500 + } + }, + { + "key": { + "symbol": "protocol_bps" + }, + "val": { + "u32": 2500 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_get_creator_fee_config_is_read_only.1.json b/creator-keys/test_snapshots/test_get_creator_fee_config_is_read_only.1.json index 1eba70d..00557cd 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_config_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_config_is_read_only.1.json @@ -19,7 +19,8 @@ }, { "string": "test_creator" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_config_multiple_creators_independent.1.json b/creator-keys/test_snapshots/test_get_creator_fee_config_multiple_creators_independent.1.json index 3e1edef..4ef6865 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_config_multiple_creators_independent.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_config_multiple_creators_independent.1.json @@ -19,7 +19,8 @@ }, { "string": "creator_one" - } + }, + "void" ] } }, @@ -41,7 +42,8 @@ }, { "string": "creator_two" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_config_registered_no_fee_config.1.json b/creator-keys/test_snapshots/test_get_creator_fee_config_registered_no_fee_config.1.json index d2ee2fc..21be40d 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_config_registered_no_fee_config.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_config_registered_no_fee_config.1.json @@ -19,7 +19,8 @@ }, { "string": "test_creator" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_config_registered_with_fee_config.1.json b/creator-keys/test_snapshots/test_get_creator_fee_config_registered_with_fee_config.1.json index 8285b79..a04e43e 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_config_registered_with_fee_config.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_config_registered_with_fee_config.1.json @@ -19,7 +19,8 @@ }, { "string": "test_creator" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_config_updates_after_fee_reconfiguration.1.json b/creator-keys/test_snapshots/test_get_creator_fee_config_updates_after_fee_reconfiguration.1.json index 7141403..17ba0f4 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_config_updates_after_fee_reconfiguration.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_config_updates_after_fee_reconfiguration.1.json @@ -19,7 +19,8 @@ }, { "string": "test_creator" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_recipient_is_read_only.1.json b/creator-keys/test_snapshots/test_get_creator_fee_recipient_is_read_only.1.json index 50bd1dc..2105df1 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_recipient_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_recipient_is_read_only.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_fee_recipient_returns_creator_address.1.json b/creator-keys/test_snapshots/test_get_creator_fee_recipient_returns_creator_address.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_get_creator_fee_recipient_returns_creator_address.1.json +++ b/creator-keys/test_snapshots/test_get_creator_fee_recipient_returns_creator_address.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_supply_is_read_only.1.json b/creator-keys/test_snapshots/test_get_creator_supply_is_read_only.1.json index 7ad7c86..e948155 100644 --- a/creator-keys/test_snapshots/test_get_creator_supply_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_get_creator_supply_is_read_only.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_supply_returns_current_supply.1.json b/creator-keys/test_snapshots/test_get_creator_supply_returns_current_supply.1.json index f682f6f..0232833 100644 --- a/creator-keys/test_snapshots/test_get_creator_supply_returns_current_supply.1.json +++ b/creator-keys/test_snapshots/test_get_creator_supply_returns_current_supply.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_treasury_share_is_read_only.1.json b/creator-keys/test_snapshots/test_get_creator_treasury_share_is_read_only.1.json index aa72561..4c20cac 100644 --- a/creator-keys/test_snapshots/test_get_creator_treasury_share_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_get_creator_treasury_share_is_read_only.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_creator_treasury_share_returns_configured_value.1.json b/creator-keys/test_snapshots/test_get_creator_treasury_share_returns_configured_value.1.json index 9fdbd84..7963a06 100644 --- a/creator-keys/test_snapshots/test_get_creator_treasury_share_returns_configured_value.1.json +++ b/creator-keys/test_snapshots/test_get_creator_treasury_share_returns_configured_value.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_key_decimals_stable_after_state_changes.1.json b/creator-keys/test_snapshots/test_get_key_decimals_stable_after_state_changes.1.json index 8e48da9..6bbfee1 100644 --- a/creator-keys/test_snapshots/test_get_key_decimals_stable_after_state_changes.1.json +++ b/creator-keys/test_snapshots/test_get_key_decimals_stable_after_state_changes.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_key_name_success.1.json b/creator-keys/test_snapshots/test_get_key_name_success.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_get_key_name_success.1.json +++ b/creator-keys/test_snapshots/test_get_key_name_success.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_key_symbol_success.1.json b/creator-keys/test_snapshots/test_get_key_symbol_success.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_get_key_symbol_success.1.json +++ b/creator-keys/test_snapshots/test_get_key_symbol_success.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_max_supply_returns_cap_for_capped_creator.1.json b/creator-keys/test_snapshots/test_get_max_supply_returns_cap_for_capped_creator.1.json new file mode 100644 index 0000000..d6a4e84 --- /dev/null +++ b/creator-keys/test_snapshots/test_get_max_supply_returns_cap_for_capped_creator.1.json @@ -0,0 +1,265 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "alice" + }, + { + "u32": 5 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_get_max_supply_returns_none_for_uncapped_creator.1.json b/creator-keys/test_snapshots/test_get_max_supply_returns_none_for_uncapped_creator.1.json new file mode 100644 index 0000000..b9983a2 --- /dev/null +++ b/creator-keys/test_snapshots/test_get_max_supply_returns_none_for_uncapped_creator.1.json @@ -0,0 +1,218 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "alice" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_get_protocol_state_version_stable_after_state_changes.1.json b/creator-keys/test_snapshots/test_get_protocol_state_version_stable_after_state_changes.1.json index 227cc3c..fc5f264 100644 --- a/creator-keys/test_snapshots/test_get_protocol_state_version_stable_after_state_changes.1.json +++ b/creator-keys/test_snapshots/test_get_protocol_state_version_stable_after_state_changes.1.json @@ -69,7 +69,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_sell_quote_zero_amount_returns_noop_quote.1.json b/creator-keys/test_snapshots/test_get_sell_quote_zero_amount_returns_noop_quote.1.json index c014de0..57aa25c 100644 --- a/creator-keys/test_snapshots/test_get_sell_quote_zero_amount_returns_noop_quote.1.json +++ b/creator-keys/test_snapshots/test_get_sell_quote_zero_amount_returns_noop_quote.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_total_key_supply_increments_after_buy.1.json b/creator-keys/test_snapshots/test_get_total_key_supply_increments_after_buy.1.json index 897483d..5ce3c00 100644 --- a/creator-keys/test_snapshots/test_get_total_key_supply_increments_after_buy.1.json +++ b/creator-keys/test_snapshots/test_get_total_key_supply_increments_after_buy.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_total_key_supply_is_read_only.1.json b/creator-keys/test_snapshots/test_get_total_key_supply_is_read_only.1.json index a95a667..8785f0f 100644 --- a/creator-keys/test_snapshots/test_get_total_key_supply_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_get_total_key_supply_is_read_only.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_get_total_key_supply_returns_zero_for_new_creator.1.json b/creator-keys/test_snapshots/test_get_total_key_supply_returns_zero_for_new_creator.1.json index fc9f97d..6c7dce8 100644 --- a/creator-keys/test_snapshots/test_get_total_key_supply_returns_zero_for_new_creator.1.json +++ b/creator-keys/test_snapshots/test_get_total_key_supply_returns_zero_for_new_creator.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_count_reflects_mixed_trade_correctly.1.json b/creator-keys/test_snapshots/test_holder_count_reflects_mixed_trade_correctly.1.json index b333912..6dc3afb 100644 --- a/creator-keys/test_snapshots/test_holder_count_reflects_mixed_trade_correctly.1.json +++ b/creator-keys/test_snapshots/test_holder_count_reflects_mixed_trade_correctly.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_count_returns_to_zero_after_last_holder_exit_and_rebuy.1.json b/creator-keys/test_snapshots/test_holder_count_returns_to_zero_after_last_holder_exit_and_rebuy.1.json new file mode 100644 index 0000000..d4c40cd --- /dev/null +++ b/creator-keys/test_snapshots/test_holder_count_returns_to_zero_after_last_holder_exit_and_rebuy.1.json @@ -0,0 +1,548 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "sell_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1700000000, + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 1 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_holder_count_unchanged_when_holder_still_has_keys.1.json b/creator-keys/test_snapshots/test_holder_count_unchanged_when_holder_still_has_keys.1.json index d5110ea..471a682 100644 --- a/creator-keys/test_snapshots/test_holder_count_unchanged_when_holder_still_has_keys.1.json +++ b/creator-keys/test_snapshots/test_holder_count_unchanged_when_holder_still_has_keys.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_consistency_with_get_key_balance.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_consistency_with_get_key_balance.1.json index 8ae363b..1c0f305 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_consistency_with_get_key_balance.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_consistency_with_get_key_balance.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_increments_on_buy.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_increments_on_buy.1.json index 20b67eb..07a8d04 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_increments_on_buy.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_increments_on_buy.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_multiple_holders.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_multiple_holders.1.json index 45ca09f..1290422 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_multiple_holders.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_multiple_holders.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_no_state_mutation.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_no_state_mutation.1.json index 7fe4f3f..d2d9bef 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_no_state_mutation.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_no_state_mutation.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_registered_creator_unseen_wallet.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_registered_creator_unseen_wallet.1.json index f406606..98d7e6e 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_registered_creator_unseen_wallet.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_registered_creator_unseen_wallet.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_starts_at_zero.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_starts_at_zero.1.json index 2edeb16..b2ebf97 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_starts_at_zero.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_starts_at_zero.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_structure_fields.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_structure_fields.1.json index b7c6a47..f4ab675 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_structure_fields.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_structure_fields.1.json @@ -44,7 +44,8 @@ }, { "string": "test" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_holder_key_count_view_zero_keys_different_creators.1.json b/creator-keys/test_snapshots/test_holder_key_count_view_zero_keys_different_creators.1.json index 28ca0e5..99a9d7b 100644 --- a/creator-keys/test_snapshots/test_holder_key_count_view_zero_keys_different_creators.1.json +++ b/creator-keys/test_snapshots/test_holder_key_count_view_zero_keys_different_creators.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, @@ -66,7 +67,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_is_creator_registered_different_creators_independent.1.json b/creator-keys/test_snapshots/test_is_creator_registered_different_creators_independent.1.json index f683210..785a1ca 100644 --- a/creator-keys/test_snapshots/test_is_creator_registered_different_creators_independent.1.json +++ b/creator-keys/test_snapshots/test_is_creator_registered_different_creators_independent.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_is_creator_registered_is_read_only.1.json b/creator-keys/test_snapshots/test_is_creator_registered_is_read_only.1.json index 15dd524..1c8aed1 100644 --- a/creator-keys/test_snapshots/test_is_creator_registered_is_read_only.1.json +++ b/creator-keys/test_snapshots/test_is_creator_registered_is_read_only.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_is_creator_registered_returns_true_after_registration.1.json b/creator-keys/test_snapshots/test_is_creator_registered_returns_true_after_registration.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_is_creator_registered_returns_true_after_registration.1.json +++ b/creator-keys/test_snapshots/test_is_creator_registered_returns_true_after_registration.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_key_balance_increments_on_buy.1.json b/creator-keys/test_snapshots/test_key_balance_increments_on_buy.1.json index 5a7f462..04b67ad 100644 --- a/creator-keys/test_snapshots/test_key_balance_increments_on_buy.1.json +++ b/creator-keys/test_snapshots/test_key_balance_increments_on_buy.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_key_balance_is_per_buyer.1.json b/creator-keys/test_snapshots/test_key_balance_is_per_buyer.1.json index 02f10f2..10b7952 100644 --- a/creator-keys/test_snapshots/test_key_balance_is_per_buyer.1.json +++ b/creator-keys/test_snapshots/test_key_balance_is_per_buyer.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_key_balance_is_per_creator.1.json b/creator-keys/test_snapshots/test_key_balance_is_per_creator.1.json index 13bd265..4174e1c 100644 --- a/creator-keys/test_snapshots/test_key_balance_is_per_creator.1.json +++ b/creator-keys/test_snapshots/test_key_balance_is_per_creator.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, @@ -66,7 +67,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_key_balance_zero_for_registered_creator_and_unseen_wallet.1.json b/creator-keys/test_snapshots/test_key_balance_zero_for_registered_creator_and_unseen_wallet.1.json index a3f8c6c..128cd68 100644 --- a/creator-keys/test_snapshots/test_key_balance_zero_for_registered_creator_and_unseen_wallet.1.json +++ b/creator-keys/test_snapshots/test_key_balance_zero_for_registered_creator_and_unseen_wallet.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_key_balance_zero_for_unregistered_creator_even_when_other_balances_exist.1.json b/creator-keys/test_snapshots/test_key_balance_zero_for_unregistered_creator_even_when_other_balances_exist.1.json index 2338c0e..42e4856 100644 --- a/creator-keys/test_snapshots/test_key_balance_zero_for_unregistered_creator_even_when_other_balances_exist.1.json +++ b/creator-keys/test_snapshots/test_key_balance_zero_for_unregistered_creator_even_when_other_balances_exist.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_max_supply_is_stable_after_buys.1.json b/creator-keys/test_snapshots/test_max_supply_is_stable_after_buys.1.json new file mode 100644 index 0000000..54dc918 --- /dev/null +++ b/creator-keys/test_snapshots/test_max_supply_is_stable_after_buys.1.json @@ -0,0 +1,538 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + { + "u32": 5 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 2 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MaxSupply" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_register_creator_accepts_max_handle_length.1.json b/creator-keys/test_snapshots/test_register_creator_accepts_max_handle_length.1.json index a3be84b..44fdd94 100644 --- a/creator-keys/test_snapshots/test_register_creator_accepts_max_handle_length.1.json +++ b/creator-keys/test_snapshots/test_register_creator_accepts_max_handle_length.1.json @@ -19,7 +19,8 @@ }, { "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_accepts_min_handle_length.1.json b/creator-keys/test_snapshots/test_register_creator_accepts_min_handle_length.1.json index 7c61f82..db84817 100644 --- a/creator-keys/test_snapshots/test_register_creator_accepts_min_handle_length.1.json +++ b/creator-keys/test_snapshots/test_register_creator_accepts_min_handle_length.1.json @@ -19,7 +19,8 @@ }, { "string": "aaa" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_different_addresses_succeeds.1.json b/creator-keys/test_snapshots/test_register_creator_different_addresses_succeeds.1.json index 55b2977..18edd69 100644 --- a/creator-keys/test_snapshots/test_register_creator_different_addresses_succeeds.1.json +++ b/creator-keys/test_snapshots/test_register_creator_different_addresses_succeeds.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, @@ -41,7 +42,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_duplicate_different_handle_fails.1.json b/creator-keys/test_snapshots/test_register_creator_duplicate_different_handle_fails.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_register_creator_duplicate_different_handle_fails.1.json +++ b/creator-keys/test_snapshots/test_register_creator_duplicate_different_handle_fails.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_duplicate_fails.1.json b/creator-keys/test_snapshots/test_register_creator_duplicate_fails.1.json index 61ac89a..b9983a2 100644 --- a/creator-keys/test_snapshots/test_register_creator_duplicate_fails.1.json +++ b/creator-keys/test_snapshots/test_register_creator_duplicate_fails.1.json @@ -19,7 +19,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_emits_event.1.json b/creator-keys/test_snapshots/test_register_creator_emits_event.1.json index db76578..397cd89 100644 --- a/creator-keys/test_snapshots/test_register_creator_emits_event.1.json +++ b/creator-keys/test_snapshots/test_register_creator_emits_event.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_event_data_is_indexer_friendly.1.json b/creator-keys/test_snapshots/test_register_creator_event_data_is_indexer_friendly.1.json index db76578..397cd89 100644 --- a/creator-keys/test_snapshots/test_register_creator_event_data_is_indexer_friendly.1.json +++ b/creator-keys/test_snapshots/test_register_creator_event_data_is_indexer_friendly.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_event_fires_once.1.json b/creator-keys/test_snapshots/test_register_creator_event_fires_once.1.json index 6abb7ac..b4300c6 100644 --- a/creator-keys/test_snapshots/test_register_creator_event_fires_once.1.json +++ b/creator-keys/test_snapshots/test_register_creator_event_fires_once.1.json @@ -44,7 +44,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_register_creator_handle_one_over_max_rejected.1.json b/creator-keys/test_snapshots/test_register_creator_handle_one_over_max_rejected.1.json new file mode 100644 index 0000000..5655749 --- /dev/null +++ b/creator-keys/test_snapshots/test_register_creator_handle_one_over_max_rejected.1.json @@ -0,0 +1,76 @@ +{ + "generators": { + "address": 2, + "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": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_register_creator_max_length_handle_succeeds.1.json b/creator-keys/test_snapshots/test_register_creator_max_length_handle_succeeds.1.json new file mode 100644 index 0000000..44fdd94 --- /dev/null +++ b/creator-keys/test_snapshots/test_register_creator_max_length_handle_succeeds.1.json @@ -0,0 +1,218 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_registration_with_zero_cap_is_rejected.1.json b/creator-keys/test_snapshots/test_registration_with_zero_cap_is_rejected.1.json new file mode 100644 index 0000000..5655749 --- /dev/null +++ b/creator-keys/test_snapshots/test_registration_with_zero_cap_is_rejected.1.json @@ -0,0 +1,76 @@ +{ + "generators": { + "address": 2, + "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": [] +} \ No newline at end of file diff --git a/creator-keys/test_snapshots/test_repeated_zero_amount_quote_calls_no_state_drift.1.json b/creator-keys/test_snapshots/test_repeated_zero_amount_quote_calls_no_state_drift.1.json index 2e7d43c..d27b6e0 100644 --- a/creator-keys/test_snapshots/test_repeated_zero_amount_quote_calls_no_state_drift.1.json +++ b/creator-keys/test_snapshots/test_repeated_zero_amount_quote_calls_no_state_drift.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_after_buy_succeeds_without_underflow_error.1.json b/creator-keys/test_snapshots/test_sell_after_buy_succeeds_without_underflow_error.1.json index 4097a5e..570d2b7 100644 --- a/creator-keys/test_snapshots/test_sell_after_buy_succeeds_without_underflow_error.1.json +++ b/creator-keys/test_snapshots/test_sell_after_buy_succeeds_without_underflow_error.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_full_exit_then_rebuy_updates_state.1.json b/creator-keys/test_snapshots/test_sell_full_exit_then_rebuy_updates_state.1.json index 6d8b844..8ed29fd 100644 --- a/creator-keys/test_snapshots/test_sell_full_exit_then_rebuy_updates_state.1.json +++ b/creator-keys/test_snapshots/test_sell_full_exit_then_rebuy_updates_state.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_key_decrements_supply_and_balance.1.json b/creator-keys/test_snapshots/test_sell_key_decrements_supply_and_balance.1.json index d5110ea..471a682 100644 --- a/creator-keys/test_snapshots/test_sell_key_decrements_supply_and_balance.1.json +++ b/creator-keys/test_snapshots/test_sell_key_decrements_supply_and_balance.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_key_fails_when_seller_has_no_keys.1.json b/creator-keys/test_snapshots/test_sell_key_fails_when_seller_has_no_keys.1.json index 3fbbbf8..7779835 100644 --- a/creator-keys/test_snapshots/test_sell_key_fails_when_seller_has_no_keys.1.json +++ b/creator-keys/test_snapshots/test_sell_key_fails_when_seller_has_no_keys.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_key_preserves_holder_count_when_seller_still_has_keys.1.json b/creator-keys/test_snapshots/test_sell_key_preserves_holder_count_when_seller_still_has_keys.1.json index 5293b23..09e5624 100644 --- a/creator-keys/test_snapshots/test_sell_key_preserves_holder_count_when_seller_still_has_keys.1.json +++ b/creator-keys/test_snapshots/test_sell_key_preserves_holder_count_when_seller_still_has_keys.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_key_removes_holder_when_last_key_is_sold.1.json b/creator-keys/test_snapshots/test_sell_key_removes_holder_when_last_key_is_sold.1.json index 16ab270..454a31e 100644 --- a/creator-keys/test_snapshots/test_sell_key_removes_holder_when_last_key_is_sold.1.json +++ b/creator-keys/test_snapshots/test_sell_key_removes_holder_when_last_key_is_sold.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_quote_with_large_amount_succeeds.1.json b/creator-keys/test_snapshots/test_sell_quote_with_large_amount_succeeds.1.json index 08616a2..74ae930 100644 --- a/creator-keys/test_snapshots/test_sell_quote_with_large_amount_succeeds.1.json +++ b/creator-keys/test_snapshots/test_sell_quote_with_large_amount_succeeds.1.json @@ -45,7 +45,8 @@ }, { "string": "creator5" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json b/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json index dc67279..36f1de2 100644 --- a/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json +++ b/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_50_50_fees_succeeds.1.json @@ -45,7 +45,8 @@ }, { "string": "creator8" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_succeeds.1.json b/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_succeeds.1.json index 386515c..55f9980 100644 --- a/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_succeeds.1.json +++ b/creator-keys/test_snapshots/test_sell_quote_with_maximum_safe_amount_succeeds.1.json @@ -45,7 +45,8 @@ }, { "string": "creator6" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_quote_zero_supply_boundary_is_rejected.1.json b/creator-keys/test_snapshots/test_sell_quote_zero_supply_boundary_is_rejected.1.json index 46f87ab..88d5506 100644 --- a/creator-keys/test_snapshots/test_sell_quote_zero_supply_boundary_is_rejected.1.json +++ b/creator-keys/test_snapshots/test_sell_quote_zero_supply_boundary_is_rejected.1.json @@ -69,7 +69,8 @@ }, { "string": "edge2" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_second_key_after_selling_last_returns_insufficient_balance.1.json b/creator-keys/test_snapshots/test_sell_second_key_after_selling_last_returns_insufficient_balance.1.json index 277709d..c0f8b6a 100644 --- a/creator-keys/test_snapshots/test_sell_second_key_after_selling_last_returns_insufficient_balance.1.json +++ b/creator-keys/test_snapshots/test_sell_second_key_after_selling_last_returns_insufficient_balance.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_two_keys_succeeds_without_underflow_error.1.json b/creator-keys/test_snapshots/test_sell_two_keys_succeeds_without_underflow_error.1.json index 0414c94..c61d438 100644 --- a/creator-keys/test_snapshots/test_sell_two_keys_succeeds_without_underflow_error.1.json +++ b/creator-keys/test_snapshots/test_sell_two_keys_succeeds_without_underflow_error.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_sell_with_no_keys_returns_insufficient_balance.1.json b/creator-keys/test_snapshots/test_sell_with_no_keys_returns_insufficient_balance.1.json index 3fbbbf8..7779835 100644 --- a/creator-keys/test_snapshots/test_sell_with_no_keys_returns_insufficient_balance.1.json +++ b/creator-keys/test_snapshots/test_sell_with_no_keys_returns_insufficient_balance.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_alternating_buys_and_sells.1.json b/creator-keys/test_snapshots/test_supply_alternating_buys_and_sells.1.json index 78e09ba..5130b45 100644 --- a/creator-keys/test_snapshots/test_supply_alternating_buys_and_sells.1.json +++ b/creator-keys/test_snapshots/test_supply_alternating_buys_and_sells.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_and_balance_decremented_correctly_after_sell.1.json b/creator-keys/test_snapshots/test_supply_and_balance_decremented_correctly_after_sell.1.json index d5110ea..471a682 100644 --- a/creator-keys/test_snapshots/test_supply_and_balance_decremented_correctly_after_sell.1.json +++ b/creator-keys/test_snapshots/test_supply_and_balance_decremented_correctly_after_sell.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_buy_then_sell_returns_to_zero.1.json b/creator-keys/test_snapshots/test_supply_buy_then_sell_returns_to_zero.1.json index 29c8e9b..e965b65 100644 --- a/creator-keys/test_snapshots/test_supply_buy_then_sell_returns_to_zero.1.json +++ b/creator-keys/test_snapshots/test_supply_buy_then_sell_returns_to_zero.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_buy_two_sell_one_conserves_supply.1.json b/creator-keys/test_snapshots/test_supply_buy_two_sell_one_conserves_supply.1.json index 0c7a900..dbc042d 100644 --- a/creator-keys/test_snapshots/test_supply_buy_two_sell_one_conserves_supply.1.json +++ b/creator-keys/test_snapshots/test_supply_buy_two_sell_one_conserves_supply.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_changes_for_one_creator_do_not_affect_another.1.json b/creator-keys/test_snapshots/test_supply_changes_for_one_creator_do_not_affect_another.1.json index 866f0de..9772c8b 100644 --- a/creator-keys/test_snapshots/test_supply_changes_for_one_creator_do_not_affect_another.1.json +++ b/creator-keys/test_snapshots/test_supply_changes_for_one_creator_do_not_affect_another.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, @@ -66,7 +67,8 @@ }, { "string": "bob" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_mixed_trades_three_participants.1.json b/creator-keys/test_snapshots/test_supply_mixed_trades_three_participants.1.json index fa90841..a74cc2f 100644 --- a/creator-keys/test_snapshots/test_supply_mixed_trades_three_participants.1.json +++ b/creator-keys/test_snapshots/test_supply_mixed_trades_three_participants.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_multiple_buys_per_holder_sum_equals_total.1.json b/creator-keys/test_snapshots/test_supply_multiple_buys_per_holder_sum_equals_total.1.json index 41c8335..67b74dc 100644 --- a/creator-keys/test_snapshots/test_supply_multiple_buys_per_holder_sum_equals_total.1.json +++ b/creator-keys/test_snapshots/test_supply_multiple_buys_per_holder_sum_equals_total.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_never_goes_below_zero_after_all_sells.1.json b/creator-keys/test_snapshots/test_supply_never_goes_below_zero_after_all_sells.1.json index d5ae7ae..bba0d2e 100644 --- a/creator-keys/test_snapshots/test_supply_never_goes_below_zero_after_all_sells.1.json +++ b/creator-keys/test_snapshots/test_supply_never_goes_below_zero_after_all_sells.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_supply_three_buyers_sum_equals_total.1.json b/creator-keys/test_snapshots/test_supply_three_buyers_sum_equals_total.1.json index 32820f4..82edcb8 100644 --- a/creator-keys/test_snapshots/test_supply_three_buyers_sum_equals_total.1.json +++ b/creator-keys/test_snapshots/test_supply_three_buyers_sum_equals_total.1.json @@ -44,7 +44,8 @@ }, { "string": "alice" - } + }, + "void" ] } }, diff --git a/creator-keys/test_snapshots/test_uncapped_buy_succeeds_without_limit.1.json b/creator-keys/test_snapshots/test_uncapped_buy_succeeds_without_limit.1.json new file mode 100644 index 0000000..8b19962 --- /dev/null +++ b/creator-keys/test_snapshots/test_uncapped_buy_succeeds_without_limit.1.json @@ -0,0 +1,710 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_key_price", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "register_creator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "alice" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "buy_key", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "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": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Creator" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "fee_recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "handle" + }, + "val": { + "string": "alice" + } + }, + { + "key": { + "symbol": "holder_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "supply" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "KeyPrice" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "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_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "buy" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ], + "data": { + "vec": [ + { + "u32": 5 + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/creator-keys/tests/buy_key_event.rs b/creator-keys/tests/buy_key_event.rs index dc748df..ed876cc 100644 --- a/creator-keys/tests/buy_key_event.rs +++ b/creator-keys/tests/buy_key_event.rs @@ -16,7 +16,7 @@ fn test_buy_key_event_includes_payment_amount() { let buyer = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); let supply = client.buy_key(&creator, &buyer, &150i128); assert_eq!(supply, 1); @@ -42,7 +42,7 @@ fn test_buy_key_event_topics_include_creator_and_buyer() { let buyer = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer, &200i128); let events = env.events().all(); diff --git a/creator-keys/tests/contract_test_env/mod.rs b/creator-keys/tests/contract_test_env/mod.rs index ccc85d7..52fc5e8 100644 --- a/creator-keys/tests/contract_test_env/mod.rs +++ b/creator-keys/tests/contract_test_env/mod.rs @@ -81,7 +81,7 @@ pub fn register_test_creator( handle: &str, ) -> Address { let creator = Address::generate(env); - client.register_creator(&creator, &String::from_str(env, handle)); + client.register_creator(&creator, &String::from_str(env, handle), &None); creator } diff --git a/creator-keys/tests/creator_details_view.rs b/creator-keys/tests/creator_details_view.rs index ebb2e05..7b605a8 100644 --- a/creator-keys/tests/creator_details_view.rs +++ b/creator-keys/tests/creator_details_view.rs @@ -29,7 +29,7 @@ fn test_get_creator_details_registered_returns_correct_data() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let details = client.get_creator_details(&creator); assert!(details.is_registered); diff --git a/creator-keys/tests/creator_fee_bps.rs b/creator-keys/tests/creator_fee_bps.rs index dc9c7e1..7b34173 100644 --- a/creator-keys/tests/creator_fee_bps.rs +++ b/creator-keys/tests/creator_fee_bps.rs @@ -13,7 +13,7 @@ fn test_get_creator_fee_bps_returns_configured_value() { let admin = Address::generate(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.set_fee_config(&admin, &9000u32, &1000u32); assert_eq!(client.get_creator_fee_bps(&creator), 9000); @@ -29,7 +29,7 @@ fn test_get_creator_fee_bps_is_read_only() { let admin = Address::generate(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.set_fee_config(&admin, &7500u32, &2500u32); let first = client.get_creator_fee_bps(&creator); @@ -48,7 +48,7 @@ fn test_get_creator_fee_bps_tracks_fee_config_updates() { let admin = Address::generate(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.set_fee_config(&admin, &9000u32, &1000u32); let before_update = client.get_creator_fee_bps(&creator); diff --git a/creator-keys/tests/creator_fee_config_view.rs b/creator-keys/tests/creator_fee_config_view.rs index dc366c7..7aca525 100644 --- a/creator-keys/tests/creator_fee_config_view.rs +++ b/creator-keys/tests/creator_fee_config_view.rs @@ -28,7 +28,7 @@ fn test_get_creator_fee_config_registered_no_fee_config() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let view = client.get_creator_fee_config(&creator); @@ -50,7 +50,7 @@ fn test_get_creator_fee_config_registered_with_fee_config() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); client.set_fee_config(&admin, &9000u32, &1000u32); let view = client.get_creator_fee_config(&creator); @@ -73,7 +73,7 @@ fn test_get_creator_fee_config_is_read_only() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); client.set_fee_config(&admin, &8000u32, &2000u32); let v1 = client.get_creator_fee_config(&creator); @@ -97,7 +97,7 @@ fn test_get_creator_fee_config_updates_after_fee_reconfiguration() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); client.set_fee_config(&admin, &9000u32, &1000u32); let v1 = client.get_creator_fee_config(&creator); @@ -124,8 +124,8 @@ fn test_get_creator_fee_config_multiple_creators_independent() { let handle1 = String::from_str(&env, "creator_one"); let handle2 = String::from_str(&env, "creator_two"); - client.register_creator(&creator1, &handle1); - client.register_creator(&creator2, &handle2); + client.register_creator(&creator1, &handle1, &None); + client.register_creator(&creator2, &handle2, &None); client.set_fee_config(&admin, &9000u32, &1000u32); let view1 = client.get_creator_fee_config(&creator1); diff --git a/creator-keys/tests/creator_fee_recipient.rs b/creator-keys/tests/creator_fee_recipient.rs index 9ab3985..bce816b 100644 --- a/creator-keys/tests/creator_fee_recipient.rs +++ b/creator-keys/tests/creator_fee_recipient.rs @@ -13,7 +13,7 @@ fn test_get_creator_fee_recipient_returns_creator_address() { let client = CreatorKeysContractClient::new(&env, &contract_id); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); assert_eq!(client.get_creator_fee_recipient(&creator), creator); } @@ -27,7 +27,7 @@ fn test_get_creator_fee_recipient_is_read_only() { let client = CreatorKeysContractClient::new(&env, &contract_id); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); let first_read = client.get_creator_fee_recipient(&creator); let second_read = client.get_creator_fee_recipient(&creator); diff --git a/creator-keys/tests/creator_registration.rs b/creator-keys/tests/creator_registration.rs index 5e16292..4f7f6ef 100644 --- a/creator-keys/tests/creator_registration.rs +++ b/creator-keys/tests/creator_registration.rs @@ -26,7 +26,7 @@ fn test_is_creator_registered_returns_true_after_registration() { let client = CreatorKeysContractClient::new(&env, &contract_id); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); assert!(client.is_creator_registered(&creator)); } @@ -40,7 +40,7 @@ fn test_is_creator_registered_is_read_only() { let client = CreatorKeysContractClient::new(&env, &contract_id); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); // Multiple calls should return the same result without mutating state let r1 = client.is_creator_registered(&creator); @@ -61,7 +61,7 @@ fn test_is_creator_registered_different_creators_independent() { let alice = Address::generate(&env); let bob = Address::generate(&env); - client.register_creator(&alice, &String::from_str(&env, "alice")); + client.register_creator(&alice, &String::from_str(&env, "alice"), &None); assert!(client.is_creator_registered(&alice)); assert!(!client.is_creator_registered(&bob)); @@ -80,9 +80,9 @@ fn test_register_creator_duplicate_fails() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // Second registration with the same address should fail with error - let result = client.try_register_creator(&creator, &handle); + let result = client.try_register_creator(&creator, &handle, &None); assert_eq!(result, Err(Ok(ContractError::AlreadyRegistered))); } @@ -96,9 +96,9 @@ fn test_register_creator_duplicate_different_handle_fails() { let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); // Re-registering with a different handle should still fail - let result = client.try_register_creator(&creator, &String::from_str(&env, "alice_v2")); + let result = client.try_register_creator(&creator, &String::from_str(&env, "alice_v2"), &None); assert_eq!(result, Err(Ok(ContractError::AlreadyRegistered))); } @@ -113,8 +113,8 @@ fn test_register_creator_different_addresses_succeeds() { let alice = Address::generate(&env); let bob = Address::generate(&env); - client.register_creator(&alice, &String::from_str(&env, "alice")); - client.register_creator(&bob, &String::from_str(&env, "bob")); + client.register_creator(&alice, &String::from_str(&env, "alice"), &None); + client.register_creator(&bob, &String::from_str(&env, "bob"), &None); assert!(client.is_creator_registered(&alice)); assert!(client.is_creator_registered(&bob)); @@ -130,7 +130,7 @@ fn test_register_creator_accepts_min_handle_length() { let creator = Address::generate(&env); let min_handle = "a".repeat(HANDLE_LEN_MIN as usize); - client.register_creator(&creator, &String::from_str(&env, &min_handle)); + client.register_creator(&creator, &String::from_str(&env, &min_handle), &None); assert!(client.is_creator_registered(&creator)); } @@ -145,7 +145,7 @@ fn test_register_creator_accepts_max_handle_length() { let creator = Address::generate(&env); let max_handle = "a".repeat(HANDLE_LEN_MAX as usize); - client.register_creator(&creator, &String::from_str(&env, &max_handle)); + client.register_creator(&creator, &String::from_str(&env, &max_handle), &None); assert!(client.is_creator_registered(&creator)); } @@ -160,7 +160,7 @@ fn test_register_creator_rejects_handle_shorter_than_min() { let creator = Address::generate(&env); let short_handle = "a".repeat((HANDLE_LEN_MIN - 1) as usize); - let result = client.try_register_creator(&creator, &String::from_str(&env, &short_handle)); + let result = client.try_register_creator(&creator, &String::from_str(&env, &short_handle), &None); assert_eq!(result, Err(Ok(ContractError::HandleTooShort))); } @@ -174,7 +174,7 @@ fn test_register_creator_rejects_handle_longer_than_max() { let creator = Address::generate(&env); let long_handle = "a".repeat((HANDLE_LEN_MAX + 1) as usize); - let result = client.try_register_creator(&creator, &String::from_str(&env, &long_handle)); + let result = client.try_register_creator(&creator, &String::from_str(&env, &long_handle), &None); assert_eq!(result, Err(Ok(ContractError::HandleTooLong))); } @@ -188,7 +188,7 @@ fn test_register_creator_rejects_invalid_characters_in_handle() { let creator = Address::generate(&env); let invalid_handle = String::from_str(&env, "Alice-01"); - let result = client.try_register_creator(&creator, &invalid_handle); + let result = client.try_register_creator(&creator, &invalid_handle, &None); assert_eq!(result, Err(Ok(ContractError::InvalidHandleCharacter))); } @@ -204,7 +204,7 @@ fn test_register_creator_max_length_handle_succeeds() { let creator = Address::generate(&env); let max_handle = String::from_str(&env, &"a".repeat(HANDLE_LEN_MAX as usize)); - client.register_creator(&creator, &max_handle); + client.register_creator(&creator, &max_handle, &None); assert!(client.is_creator_registered(&creator)); } @@ -219,7 +219,7 @@ fn test_register_creator_handle_one_over_max_rejected() { let creator = Address::generate(&env); let over_max_handle = String::from_str(&env, &"a".repeat((HANDLE_LEN_MAX + 1) as usize)); - let result = client.try_register_creator(&creator, &over_max_handle); + let result = client.try_register_creator(&creator, &over_max_handle, &None); assert_eq!(result, Err(Ok(ContractError::HandleTooLong))); } diff --git a/creator-keys/tests/creator_supply.rs b/creator-keys/tests/creator_supply.rs index 0be97ac..2529d4b 100644 --- a/creator-keys/tests/creator_supply.rs +++ b/creator-keys/tests/creator_supply.rs @@ -11,7 +11,7 @@ fn setup(env: &Env) -> (CreatorKeysContractClient<'_>, Address, Address) { client.set_key_price(&admin, &100_i128); let creator = Address::generate(env); - client.register_creator(&creator, &String::from_str(env, "alice")); + client.register_creator(&creator, &String::from_str(env, "alice"), &None); (client, admin, creator) } diff --git a/creator-keys/tests/creator_treasury_share.rs b/creator-keys/tests/creator_treasury_share.rs index 8b75c5a..068b81a 100644 --- a/creator-keys/tests/creator_treasury_share.rs +++ b/creator-keys/tests/creator_treasury_share.rs @@ -13,7 +13,7 @@ fn test_get_creator_treasury_share_returns_configured_value() { let admin = Address::generate(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.set_fee_config(&admin, &9000u32, &1000u32); assert_eq!(client.get_creator_treasury_share(&creator), 9000); @@ -29,7 +29,7 @@ fn test_get_creator_treasury_share_is_read_only() { let admin = Address::generate(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.set_fee_config(&admin, &8000u32, &2000u32); let first = client.get_creator_treasury_share(&creator); diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 6a47893..a4bc298 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -38,7 +38,7 @@ fn test_register_creator_emits_event() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let events = env.events().all(); assert!(!events.is_empty(), "should emit at least one event"); @@ -63,7 +63,7 @@ fn test_register_creator_event_data_is_indexer_friendly() { let creator = Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let events = env.events().all(); let last = events.last().unwrap(); @@ -102,7 +102,7 @@ fn test_register_creator_event_fires_once() { // Count events before and after let before = env.events().all().len(); - client.register_creator(&creator, &String::from_str(&env, "bob")); + client.register_creator(&creator, &String::from_str(&env, "bob"), &None); let after = env.events().all().len(); assert_eq!(after - before, 1, "register should emit exactly one event"); @@ -116,7 +116,7 @@ fn test_assert_event_topic_matches_rejects_unexpected_identifier() { let (client, _) = setup(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); let events = env.events().all(); let last = events.last().unwrap(); @@ -135,7 +135,7 @@ fn test_buy_key_emits_event_with_correct_topics() { let creator = Address::generate(&env); let buyer = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer, &100_i128); let events = env.events().all(); @@ -167,7 +167,7 @@ fn test_buy_key_event_data_is_new_supply() { let buyer1 = Address::generate(&env); let buyer2 = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); // First buy → supply = 1, payment = 100 client.buy_key(&creator, &buyer1, &100_i128); @@ -200,7 +200,7 @@ fn test_buy_key_event_present_after_purchase() { let creator = Address::generate(&env); let buyer = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer, &100_i128); // Verify the buy event is present in the event log diff --git a/creator-keys/tests/holder_key_count_view.rs b/creator-keys/tests/holder_key_count_view.rs index e1387b0..d8ff724 100644 --- a/creator-keys/tests/holder_key_count_view.rs +++ b/creator-keys/tests/holder_key_count_view.rs @@ -9,7 +9,7 @@ fn setup_with_creator(env: &Env) -> (CreatorKeysContractClient<'_>, Address, Add let admin = Address::generate(env); let creator = Address::generate(env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(env, "test")); + client.register_creator(&creator, &String::from_str(env, "test"), &None); (client, creator, admin) } @@ -172,8 +172,8 @@ fn test_holder_key_count_view_zero_keys_different_creators() { let holder = Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator_a, &String::from_str(&env, "alice")); - client.register_creator(&creator_b, &String::from_str(&env, "bob")); + client.register_creator(&creator_a, &String::from_str(&env, "alice"), &None); + client.register_creator(&creator_b, &String::from_str(&env, "bob"), &None); // Holder buys keys only from creator A client.buy_key(&creator_a, &holder, &100i128); diff --git a/creator-keys/tests/key_balance.rs b/creator-keys/tests/key_balance.rs index 47204ad..fb3b266 100644 --- a/creator-keys/tests/key_balance.rs +++ b/creator-keys/tests/key_balance.rs @@ -30,7 +30,7 @@ fn test_key_balance_increments_on_buy() { let buyer = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); assert_eq!(client.get_key_balance(&creator, &buyer), 0); @@ -55,7 +55,7 @@ fn test_key_balance_is_per_buyer() { let buyer_b = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer_a, &100i128); client.buy_key(&creator, &buyer_a, &100i128); @@ -79,8 +79,8 @@ fn test_key_balance_is_per_creator() { let buyer = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator_a, &String::from_str(&env, "alice")); - client.register_creator(&creator_b, &String::from_str(&env, "bob")); + client.register_creator(&creator_a, &String::from_str(&env, "alice"), &None); + client.register_creator(&creator_b, &String::from_str(&env, "bob"), &None); client.buy_key(&creator_a, &buyer, &100i128); @@ -102,7 +102,7 @@ fn test_key_balance_zero_for_unregistered_creator_even_when_other_balances_exist let buyer = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(®istered_creator, &String::from_str(&env, "alice")); + client.register_creator(®istered_creator, &String::from_str(&env, "alice"), &None); client.buy_key(®istered_creator, &buyer, &100i128); assert_eq!(client.get_key_balance(&unregistered_creator, &buyer), 0); @@ -122,7 +122,7 @@ fn test_key_balance_zero_for_registered_creator_and_unseen_wallet() { let unseen_wallet = soroban_sdk::Address::generate(&env); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer_with_balance, &100i128); assert_eq!(client.get_key_balance(&creator, &unseen_wallet), 0); diff --git a/creator-keys/tests/key_decimals.rs b/creator-keys/tests/key_decimals.rs index bb3cc3f..c418eed 100644 --- a/creator-keys/tests/key_decimals.rs +++ b/creator-keys/tests/key_decimals.rs @@ -38,7 +38,7 @@ fn test_get_key_decimals_stable_after_state_changes() { client.set_fee_config(&admin, &9000u32, &1000u32); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer, &100i128); assert_eq!(client.get_key_decimals(), 7); diff --git a/creator-keys/tests/key_name.rs b/creator-keys/tests/key_name.rs index af401dc..27b5b08 100644 --- a/creator-keys/tests/key_name.rs +++ b/creator-keys/tests/key_name.rs @@ -13,7 +13,7 @@ fn test_get_key_name_success() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let name = client.get_key_name(&creator); assert_eq!(name, handle); diff --git a/creator-keys/tests/key_supply.rs b/creator-keys/tests/key_supply.rs index 3bad7b0..2e77f27 100644 --- a/creator-keys/tests/key_supply.rs +++ b/creator-keys/tests/key_supply.rs @@ -20,7 +20,7 @@ fn test_get_total_key_supply_returns_zero_for_new_creator() { let (client, _) = setup(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); assert_eq!(client.get_total_key_supply(&creator), 0); } @@ -43,7 +43,7 @@ fn test_get_total_key_supply_increments_after_buy() { let creator = Address::generate(&env); let buyer = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); assert_eq!(client.get_total_key_supply(&creator), 0); @@ -62,7 +62,7 @@ fn test_get_total_key_supply_is_read_only() { let (client, _) = setup(&env); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); // Call multiple times — should not change state let s1 = client.get_total_key_supply(&creator); @@ -82,7 +82,7 @@ fn test_buy_key_zero_payment_fails() { let creator = Address::generate(&env); let buyer = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); let result = client.try_buy_key(&creator, &buyer, &0_i128); assert_eq!(result, Err(Ok(ContractError::NotPositiveAmount))); @@ -96,7 +96,7 @@ fn test_buy_key_negative_payment_fails() { let creator = Address::generate(&env); let buyer = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); let result = client.try_buy_key(&creator, &buyer, &-50_i128); assert_eq!(result, Err(Ok(ContractError::NotPositiveAmount))); @@ -110,7 +110,7 @@ fn test_buy_key_positive_payment_succeeds() { let creator = Address::generate(&env); let buyer = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); let supply = client.buy_key(&creator, &buyer, &100_i128); assert_eq!(supply, 1); diff --git a/creator-keys/tests/key_symbol.rs b/creator-keys/tests/key_symbol.rs index 9c5618b..d881ab6 100644 --- a/creator-keys/tests/key_symbol.rs +++ b/creator-keys/tests/key_symbol.rs @@ -13,7 +13,7 @@ fn test_get_key_symbol_success() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "alice"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); let symbol = client.get_key_symbol(&creator); assert_eq!(symbol, handle); diff --git a/creator-keys/tests/protocol_state_version.rs b/creator-keys/tests/protocol_state_version.rs index 6757d3d..3c02306 100644 --- a/creator-keys/tests/protocol_state_version.rs +++ b/creator-keys/tests/protocol_state_version.rs @@ -38,7 +38,7 @@ fn test_get_protocol_state_version_stable_after_state_changes() { client.set_fee_config(&admin, &9000u32, &1000u32); client.set_key_price(&admin, &100i128); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer, &100i128); client.set_treasury_address(&admin, &Address::generate(&env)); diff --git a/creator-keys/tests/supply_cap.rs b/creator-keys/tests/supply_cap.rs new file mode 100644 index 0000000..6ba2a14 --- /dev/null +++ b/creator-keys/tests/supply_cap.rs @@ -0,0 +1,167 @@ +//! Tests for optional max_supply cap per creator at registration. + +mod contract_test_env; + +use contract_test_env::{register_creator_keys, set_key_price_for_tests, test_env_with_auths}; +use creator_keys::ContractError; +use soroban_sdk::{testutils::Address as _, Address, String}; + +fn register_capped( + env: &soroban_sdk::Env, + client: &creator_keys::CreatorKeysContractClient<'_>, + handle: &str, + cap: u32, +) -> Address { + let creator = Address::generate(env); + client.register_creator(&creator, &String::from_str(env, handle), &Some(cap)); + creator +} + +fn register_uncapped( + env: &soroban_sdk::Env, + client: &creator_keys::CreatorKeysContractClient<'_>, + handle: &str, +) -> Address { + let creator = Address::generate(env); + client.register_creator(&creator, &String::from_str(env, handle), &None); + creator +} + +// ── None (uncapped) behavior ───────────────────────────────────────────── + +#[test] +fn test_uncapped_buy_succeeds_without_limit() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + set_key_price_for_tests(&env, &client, 100); + + let creator = register_uncapped(&env, &client, "alice"); + let buyer = Address::generate(&env); + + // Buy many keys — no cap should stop this. + for expected in 1u32..=5 { + let supply = client.buy_key(&creator, &buyer, &100); + assert_eq!(supply, expected); + } +} + +#[test] +fn test_get_max_supply_returns_none_for_uncapped_creator() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + + let creator = register_uncapped(&env, &client, "alice"); + assert_eq!(client.get_max_supply(&creator), None); +} + +// ── Some(n) cap validation ──────────────────────────────────────────────── + +#[test] +fn test_registration_with_zero_cap_is_rejected() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + + let creator = Address::generate(&env); + let result = + client.try_register_creator(&creator, &String::from_str(&env, "alice"), &Some(0u32)); + assert_eq!(result, Err(Ok(ContractError::InvalidMaxSupply))); +} + +#[test] +fn test_get_max_supply_returns_cap_for_capped_creator() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + + let creator = register_capped(&env, &client, "alice", 5); + assert_eq!(client.get_max_supply(&creator), Some(5)); +} + +// ── Capped buy within limit ─────────────────────────────────────────────── + +#[test] +fn test_capped_buy_within_limit_succeeds() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + set_key_price_for_tests(&env, &client, 100); + + let creator = register_capped(&env, &client, "alice", 3); + let buyer = Address::generate(&env); + + let supply = client.buy_key(&creator, &buyer, &100); + assert_eq!(supply, 1); + + let supply = client.buy_key(&creator, &buyer, &100); + assert_eq!(supply, 2); +} + +// ── Capped buy at limit (last allowed key) ─────────────────────────────── + +#[test] +fn test_capped_buy_at_limit_succeeds() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + set_key_price_for_tests(&env, &client, 100); + + let creator = register_capped(&env, &client, "alice", 3); + let buyer = Address::generate(&env); + + // Buy up to the cap exactly. + client.buy_key(&creator, &buyer, &100); + client.buy_key(&creator, &buyer, &100); + let supply = client.buy_key(&creator, &buyer, &100); + assert_eq!(supply, 3); +} + +// ── Capped buy exceeding limit ─────────────────────────────────────────── + +#[test] +fn test_capped_buy_exceeding_limit_is_rejected() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + set_key_price_for_tests(&env, &client, 100); + + let creator = register_capped(&env, &client, "alice", 3); + let buyer = Address::generate(&env); + + client.buy_key(&creator, &buyer, &100); + client.buy_key(&creator, &buyer, &100); + client.buy_key(&creator, &buyer, &100); + + // One more buy must fail with SupplyCapExceeded. + let result = client.try_buy_key(&creator, &buyer, &100); + assert_eq!(result, Err(Ok(ContractError::SupplyCapExceeded))); +} + +#[test] +fn test_capped_buy_one_key_cap_then_exceed_is_rejected() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + set_key_price_for_tests(&env, &client, 100); + + let creator = register_capped(&env, &client, "alice", 1); + let buyer = Address::generate(&env); + + let supply = client.buy_key(&creator, &buyer, &100); + assert_eq!(supply, 1); + + let result = client.try_buy_key(&creator, &buyer, &100); + assert_eq!(result, Err(Ok(ContractError::SupplyCapExceeded))); +} + +// ── Cap is immutable (no update function exists) ───────────────────────── + +#[test] +fn test_max_supply_is_stable_after_buys() { + let env = test_env_with_auths(); + let (client, _) = register_creator_keys(&env); + set_key_price_for_tests(&env, &client, 100); + + let creator = register_capped(&env, &client, "alice", 5); + let buyer = Address::generate(&env); + + client.buy_key(&creator, &buyer, &100); + client.buy_key(&creator, &buyer, &100); + + // Cap must remain unchanged after purchases. + assert_eq!(client.get_max_supply(&creator), Some(5)); +} From 6a6ee952845de3776975673eff58b07c1e295079 Mon Sep 17 00:00:00 2001 From: Alex Benjamin Date: Wed, 17 Jun 2026 22:27:28 +0000 Subject: [PATCH 2/6] Fix formatting for CI rustfmt check --- creator-keys/src/lib.rs | 9 ++++----- creator-keys/tests/creator_registration.rs | 6 ++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/creator-keys/src/lib.rs b/creator-keys/src/lib.rs index 233c9f2..f8082c6 100644 --- a/creator-keys/src/lib.rs +++ b/creator-keys/src/lib.rs @@ -62,6 +62,8 @@ pub enum ContractError { HandleTooLong = 13, InvalidHandleCharacter = 14, ZeroAddress = 15, + InvalidMaxSupply = 16, + SupplyCapExceeded = 17, } pub mod fee { @@ -367,6 +369,7 @@ pub enum DataKey { ProtocolFeeRecipientBalance, CreatorFeeBalance(Address), ProtocolStateVersion, + MaxSupply(Address), } #[derive(Clone, Debug, PartialEq)] @@ -734,11 +737,7 @@ impl CreatorKeysContract { // Enforce supply cap if one was set at registration. let cap_key = constants::storage::max_supply(&creator); - if let Some(cap) = env - .storage() - .persistent() - .get::(&cap_key) - { + if let Some(cap) = env.storage().persistent().get::(&cap_key) { if profile.supply >= cap { return Err(ContractError::SupplyCapExceeded); } diff --git a/creator-keys/tests/creator_registration.rs b/creator-keys/tests/creator_registration.rs index 4f7f6ef..7352bd5 100644 --- a/creator-keys/tests/creator_registration.rs +++ b/creator-keys/tests/creator_registration.rs @@ -160,7 +160,8 @@ fn test_register_creator_rejects_handle_shorter_than_min() { let creator = Address::generate(&env); let short_handle = "a".repeat((HANDLE_LEN_MIN - 1) as usize); - let result = client.try_register_creator(&creator, &String::from_str(&env, &short_handle), &None); + let result = + client.try_register_creator(&creator, &String::from_str(&env, &short_handle), &None); assert_eq!(result, Err(Ok(ContractError::HandleTooShort))); } @@ -174,7 +175,8 @@ fn test_register_creator_rejects_handle_longer_than_max() { let creator = Address::generate(&env); let long_handle = "a".repeat((HANDLE_LEN_MAX + 1) as usize); - let result = client.try_register_creator(&creator, &String::from_str(&env, &long_handle), &None); + let result = + client.try_register_creator(&creator, &String::from_str(&env, &long_handle), &None); assert_eq!(result, Err(Ok(ContractError::HandleTooLong))); } From 49106bb537c640a99ce2553b5ac43691d8b60fdc Mon Sep 17 00:00:00 2001 From: Alex Benjamin Date: Wed, 17 Jun 2026 22:44:37 +0000 Subject: [PATCH 3/6] Update register_creator call sites to include max_supply optional arg --- creator-keys/tests/buy_event_buyer_address.rs | 4 ++-- creator-keys/tests/contract_test_env/mod.rs | 2 +- .../tests/creator_detail_read_consistency.rs | 4 ++-- .../empty_handle_registration_regression.rs | 2 +- creator-keys/tests/events.rs | 20 +++++++++---------- .../tests/holder_count_multiple_buyers.rs | 2 +- .../tests/registration_event_details.rs | 6 +++--- .../tests/sell_event_seller_address.rs | 4 ++-- creator-keys/tests/test_register_creator.rs | 4 ++-- creator-keys/tests/total_supply_overflow.rs | 2 +- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/creator-keys/tests/buy_event_buyer_address.rs b/creator-keys/tests/buy_event_buyer_address.rs index 9d72bca..77ffca7 100644 --- a/creator-keys/tests/buy_event_buyer_address.rs +++ b/creator-keys/tests/buy_event_buyer_address.rs @@ -25,7 +25,7 @@ fn test_buy_event_buyer_address_matches_caller() { // Configure contract client.set_key_price(&admin, &KEY_PRICE); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); // Clear any prior events then perform the buy env.events().all(); // clear @@ -76,7 +76,7 @@ fn test_buy_event_buyer_address_field_is_non_zero() { // Configure and execute client.set_key_price(&admin, &KEY_PRICE); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &buyer, &KEY_PRICE); // Verify the buyer address field is present and matches expected diff --git a/creator-keys/tests/contract_test_env/mod.rs b/creator-keys/tests/contract_test_env/mod.rs index 95b9077..5966012 100644 --- a/creator-keys/tests/contract_test_env/mod.rs +++ b/creator-keys/tests/contract_test_env/mod.rs @@ -119,7 +119,7 @@ pub fn register_test_creator_with_fee_config( let admin = Address::generate(env); client.set_fee_config(&admin, &creator_bps, &protocol_bps); let creator = Address::generate(env); - client.register_creator(&creator, &String::from_str(env, handle)); + client.register_creator(&creator, &String::from_str(env, handle), &None); creator } diff --git a/creator-keys/tests/creator_detail_read_consistency.rs b/creator-keys/tests/creator_detail_read_consistency.rs index f7f35c1..89a1114 100644 --- a/creator-keys/tests/creator_detail_read_consistency.rs +++ b/creator-keys/tests/creator_detail_read_consistency.rs @@ -23,7 +23,7 @@ fn test_creator_details_identical_across_three_consecutive_reads() { let handle = String::from_str(&env, "alice"); // Register creator to establish initial state - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // Perform three consecutive reads with NO state changes between them let read1 = client.get_creator_details(&creator); @@ -131,7 +131,7 @@ fn test_creator_details_no_storage_writes_during_reads() { let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "charlie"); - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // Use a sentinel holder address — no keys held, so balance stays 0. let sentinel = soroban_sdk::Address::generate(&env); diff --git a/creator-keys/tests/empty_handle_registration_regression.rs b/creator-keys/tests/empty_handle_registration_regression.rs index a3d86a9..f202c5f 100644 --- a/creator-keys/tests/empty_handle_registration_regression.rs +++ b/creator-keys/tests/empty_handle_registration_regression.rs @@ -15,7 +15,7 @@ fn test_register_creator_rejects_empty_handle() { let client = CreatorKeysContractClient::new(&env, &contract_id); let creator = Address::generate(&env); - let result = client.try_register_creator(&creator, &String::from_str(&env, "")); + let result = client.try_register_creator(&creator, &String::from_str(&env, ""), &None); assert_eq!(result, Err(Ok(ContractError::HandleTooShort))); assert!(!client.is_creator_registered(&creator)); diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index e0faa35..478b580 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -42,7 +42,7 @@ impl<'a> EventFixture<'a> { fn register_creator(&self, env: &Env, handle: &str) { self.client - .register_creator(&self.creator, &String::from_str(env, handle)); + .register_creator(&self.creator, &String::from_str(env, handle), &None); } fn buy_key(&self, buyer: &Address, payment: i128) { @@ -204,7 +204,7 @@ fn test_register_creator_emits_event() { env.mock_all_auths(); let fixture = EventFixture::new(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); let events = env.events().all(); assert!(!events.is_empty(), "should emit at least one event"); @@ -227,7 +227,7 @@ fn test_register_creator_event_data_is_indexer_friendly() { let fixture = EventFixture::new(&env); let handle = String::from_str(&env, "alice"); - fixture.client.register_creator(&fixture.creator, &handle); + fixture.client.register_creator(&fixture.creator, &handle, &None); let events = env.events().all(); let last = events.last().unwrap(); @@ -267,7 +267,7 @@ fn test_register_creator_event_fires_once() { let fixture = EventFixture::new(&env); let before = env.events().all().len(); - fixture.register_creator(&env, "bob"); + fixture.register_creator(&env, "bob", &None); let after = env.events().all().len(); assert_eq!(after - before, 1, "register should emit exactly one event"); @@ -280,7 +280,7 @@ fn test_assert_event_topic_matches_rejects_unexpected_identifier() { env.mock_all_auths(); let fixture = EventFixture::new(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); let events = env.events().all(); let last = events.last().unwrap(); @@ -295,7 +295,7 @@ fn test_buy_key_event_payload_fields_are_validated_from_fixture() { let fixture = EventFixture::new(&env); let buyer = Address::generate(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); fixture.buy_key(&buyer, 150); let topics = fixture.last_trade_topics(&env); @@ -319,7 +319,7 @@ fn test_buy_key_event_payload_tracks_new_supply_across_purchases() { let buyer1 = Address::generate(&env); let buyer2 = Address::generate(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); fixture.buy_key(&buyer1, KEY_PRICE); let first_payload = fixture.last_buy_payload(&env); @@ -344,7 +344,7 @@ fn test_buy_key_event_present_after_purchase() { let fixture = EventFixture::new(&env); let buyer = Address::generate(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); fixture.buy_key(&buyer, KEY_PRICE); let has_buy_event = env.events().all().iter().any(|(_, topics, _)| { @@ -367,7 +367,7 @@ fn test_sell_key_event_payload_fields_are_validated_from_fixture() { let fixture = EventFixture::new(&env); let seller = Address::generate(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); fixture.buy_key(&seller, KEY_PRICE); fixture.buy_key(&seller, KEY_PRICE); fixture.sell_key(&seller); @@ -388,7 +388,7 @@ fn test_sell_key_event_payload_tracks_zero_supply_after_last_sale() { let fixture = EventFixture::new(&env); let seller = Address::generate(&env); - fixture.register_creator(&env, "alice"); + fixture.register_creator(&env, "alice", &None); fixture.buy_key(&seller, KEY_PRICE); fixture.sell_key(&seller); diff --git a/creator-keys/tests/holder_count_multiple_buyers.rs b/creator-keys/tests/holder_count_multiple_buyers.rs index 6eb8520..ecd1d65 100644 --- a/creator-keys/tests/holder_count_multiple_buyers.rs +++ b/creator-keys/tests/holder_count_multiple_buyers.rs @@ -17,7 +17,7 @@ fn holder_count_tracks_distinct_buyers_and_decrements_on_exit() { let _admin = set_key_price_for_tests(&env, &client, 100); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "creator")); + client.register_creator(&creator, &String::from_str(&env, "creator"), &None); let buyer_a = Address::generate(&env); let buyer_b = Address::generate(&env); diff --git a/creator-keys/tests/registration_event_details.rs b/creator-keys/tests/registration_event_details.rs index 687b6c0..f02efb0 100644 --- a/creator-keys/tests/registration_event_details.rs +++ b/creator-keys/tests/registration_event_details.rs @@ -26,7 +26,7 @@ fn test_register_creator_event_field_values_match_fixtures() { client.set_fee_config(&admin, &expected_creator_bps, &expected_protocol_bps); // 3. Trigger registration - client.register_creator(&creator, &handle); + client.register_creator(&creator, &handle, &None); // 4. Capture the emitted event let all_events = env.events().all(); @@ -84,7 +84,7 @@ fn test_register_creator_event_fields_update_with_fee_config() { // First registration with one config client.set_fee_config(&admin, &9000, &1000); let creator1 = Address::generate(&env); - client.register_creator(&creator1, &String::from_str(&env, "creator_1")); + client.register_creator(&creator1, &String::from_str(&env, "creator_1"), &None); let event1: events::CreatorRegisteredEvent = env.events().all().last().unwrap().2.into_val(&env); @@ -94,7 +94,7 @@ fn test_register_creator_event_fields_update_with_fee_config() { // Second registration after fee config update client.set_fee_config(&admin, &8000, &2000); let creator2 = Address::generate(&env); - client.register_creator(&creator2, &String::from_str(&env, "creator_2")); + client.register_creator(&creator2, &String::from_str(&env, "creator_2"), &None); let event2: events::CreatorRegisteredEvent = env.events().all().last().unwrap().2.into_val(&env); diff --git a/creator-keys/tests/sell_event_seller_address.rs b/creator-keys/tests/sell_event_seller_address.rs index e14f651..5d81668 100644 --- a/creator-keys/tests/sell_event_seller_address.rs +++ b/creator-keys/tests/sell_event_seller_address.rs @@ -26,7 +26,7 @@ fn test_sell_event_seller_address_matches_caller() { // Configure contract client.set_key_price(&admin, &KEY_PRICE); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); // Buyer purchases keys client.buy_key(&creator, &seller, &KEY_PRICE); @@ -80,7 +80,7 @@ fn test_sell_event_seller_address_field_is_non_zero() { // Configure and execute client.set_key_price(&admin, &KEY_PRICE); - client.register_creator(&creator, &String::from_str(&env, "alice")); + client.register_creator(&creator, &String::from_str(&env, "alice"), &None); client.buy_key(&creator, &seller, &KEY_PRICE); client.sell_key(&creator, &seller); diff --git a/creator-keys/tests/test_register_creator.rs b/creator-keys/tests/test_register_creator.rs index 9dcdb71..af27d1c 100644 --- a/creator-keys/tests/test_register_creator.rs +++ b/creator-keys/tests/test_register_creator.rs @@ -13,7 +13,7 @@ fn test_register_creator_minimum_handle_length_success() { let min_handle = "a".repeat(HANDLE_LEN_MIN as usize); let handle = String::from_str(&env, &min_handle); - let result = client.try_register_creator(&creator, &handle); + let result = client.try_register_creator(&creator, &handle, &None); // Happy path: the function succeeds assert_eq!(result, Ok(Ok(()))); @@ -34,7 +34,7 @@ fn test_register_creator_below_minimum_handle_length_fails() { let short_handle = "a".repeat((HANDLE_LEN_MIN - 1) as usize); let handle = String::from_str(&env, &short_handle); - let result = client.try_register_creator(&creator, &handle); + let result = client.try_register_creator(&creator, &handle, &None); // Error case: expected failure assert_eq!(result, Err(Ok(ContractError::HandleTooShort))); diff --git a/creator-keys/tests/total_supply_overflow.rs b/creator-keys/tests/total_supply_overflow.rs index fa1d5e7..6c00f5d 100644 --- a/creator-keys/tests/total_supply_overflow.rs +++ b/creator-keys/tests/total_supply_overflow.rs @@ -19,7 +19,7 @@ fn buy_at_max_supply_is_rejected_with_overflow_and_no_state_corruption() { let _admin = set_key_price_for_tests(&env, &client, 100); let creator = Address::generate(&env); - client.register_creator(&creator, &String::from_str(&env, "maxed")); + client.register_creator(&creator, &String::from_str(&env, "maxed"), &None); // Seed supply at the ceiling to simulate "many sequential buys" cheaply. env.as_contract(&contract_id, || { From 7b2765476c1af729622b751e97dfec0f51abd3b0 Mon Sep 17 00:00:00 2001 From: Alex Benjamin Date: Wed, 17 Jun 2026 22:47:30 +0000 Subject: [PATCH 4/6] Format event test call site for cargo fmt --- creator-keys/tests/events.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 478b580..66bbeb3 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -227,7 +227,9 @@ fn test_register_creator_event_data_is_indexer_friendly() { let fixture = EventFixture::new(&env); let handle = String::from_str(&env, "alice"); - fixture.client.register_creator(&fixture.creator, &handle, &None); + fixture + .client + .register_creator(&fixture.creator, &handle, &None); let events = env.events().all(); let last = events.last().unwrap(); From e9172aed460dcf171f0e97460c30a8fe3a63d8fc Mon Sep 17 00:00:00 2001 From: Alex Benjamin Date: Wed, 17 Jun 2026 22:50:36 +0000 Subject: [PATCH 5/6] Fix events fixture register_creator helper signature --- creator-keys/tests/events.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 66bbeb3..7d71c92 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -40,9 +40,14 @@ impl<'a> EventFixture<'a> { Self { client, creator } } - fn register_creator(&self, env: &Env, handle: &str) { + fn register_creator( + &self, + env: &Env, + handle: &str, + max_supply: &Option, + ) { self.client - .register_creator(&self.creator, &String::from_str(env, handle), &None); + .register_creator(&self.creator, &String::from_str(env, handle), max_supply); } fn buy_key(&self, buyer: &Address, payment: i128) { From e0af647bcb04743df64a40f0e691d34927c25aaa Mon Sep 17 00:00:00 2001 From: Alex Benjamin Date: Wed, 17 Jun 2026 22:57:03 +0000 Subject: [PATCH 6/6] Format events fixture register_creator helper --- creator-keys/tests/events.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 7d71c92..c44ba68 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -40,12 +40,7 @@ impl<'a> EventFixture<'a> { Self { client, creator } } - fn register_creator( - &self, - env: &Env, - handle: &str, - max_supply: &Option, - ) { + fn register_creator(&self, env: &Env, handle: &str, max_supply: &Option) { self.client .register_creator(&self.creator, &String::from_str(env, handle), max_supply); }