From 2bdacc4ab58c406d13248f8e3350951b71daf418 Mon Sep 17 00:00:00 2001 From: Umar faruk Date: Wed, 1 Jul 2026 03:17:59 +0000 Subject: [PATCH] feat: add denomination_symbol and display_decimals metadata to Offering Adds two new fields to the Offering struct so wallets and dashboards can render amounts correctly without guessing payment-token display semantics. Changes ------- * RevoraError: new variant DisplayDecimalsOutOfRange = 51 (wire-stable). * Offering struct: +denomination_symbol: Symbol, +display_decimals: u32. * DataKey2: new DenominationMetadata(OfferingId) auxiliary storage key. * register_offering: two new trailing parameters (denomination_symbol, display_decimals). Validates display_decimals <= MAX_TOKEN_DECIMALS (18) before the duplicate-prevention guard, so bad values always return an error rather than silently no-oping on an existing offering. * register_offering: writes DenominationMetadata to persistent storage alongside OfferItem and OfferingRecord. * ofr_reg2 event payload extended to include denomination_symbol and display_decimals (both emit_v2_event calls updated). * get_denomination_metadata: new read-only O(1) helper returning Option<(Symbol, u32)> keyed on (issuer, namespace, token). * All 346 existing register_offering / try_register_offering call sites updated to pass the two new default arguments (&symbol_short!(""), &0). Tests (src/test.rs) ------------------- denomination_metadata_stored_and_readable denomination_metadata_zero_decimals_accepted denomination_metadata_max_decimals_accepted denomination_metadata_rejects_display_decimals_over_18 (boundary: 19) denomination_metadata_rejects_display_decimals_u32_max (boundary: max) denomination_metadata_returns_none_before_register denomination_metadata_in_ofr_reg2_event_payload denomination_metadata_reflected_in_get_offering denomination_metadata_validation_before_duplicate_guard Security notes -------------- * denomination_symbol is informational only; it does not affect payout math, token transfers, or authorization. * display_decimals is capped at 18 (MAX_TOKEN_DECIMALS) on-chain. The relationship display_decimals <= payment_token_decimals is a caller responsibility documented in the function doc-comment and can be verified off-chain via get_payment_token_decimals. * Validation order: supply_cap -> display_decimals -> bps -> duplicate guard, so all parameter errors are surfaced eagerly. * Wire value 51 is new and stable; all existing error codes unchanged. --- src/audit_summary_tests.rs | 2 +- src/chunking_tests.rs | 28 +- src/invalid_amount_matrix_tests.rs | 9 +- src/lib.rs | 102 +++- src/milestone_signals.rs | 6 +- src/normalize_share_tests.rs | 2 +- src/proptest_helpers.rs | 2 +- src/test.rs | 656 +++++++++++++++------ src/test_auth.rs | 27 +- src/test_blacklist_batch_gas.rs | 2 +- src/test_claim_transfer_fail.rs | 6 +- src/test_close_period.rs | 3 +- src/test_cross_contract.rs | 21 +- src/test_cross_contract_transfer_fail.rs | 6 +- src/test_duplicates.rs | 16 +- src/test_event_indexed_v2.rs | 10 +- src/test_freeze_matrix.rs | 7 +- src/test_indexer_fixtures.rs | 6 +- src/test_min_revenue_threshold_boundary.rs | 2 +- src/test_namespaces.rs | 48 +- src/test_override_audit_trail.rs | 2 +- src/test_pause_tiers.rs | 7 +- src/test_period_id_boundary.rs | 36 +- src/test_prove_distribution.rs | 33 +- src/test_reconciliation_bug.rs | 2 +- src/test_snapshot_finalization.rs | 2 +- src/test_snapshot_monotonicity_replay.rs | 5 +- src/test_snapshot_negative_matrix.rs | 2 +- src/test_time_windows.rs | 61 +- 29 files changed, 754 insertions(+), 357 deletions(-) diff --git a/src/audit_summary_tests.rs b/src/audit_summary_tests.rs index 536005dd2..eb39a6a6d 100644 --- a/src/audit_summary_tests.rs +++ b/src/audit_summary_tests.rs @@ -21,7 +21,7 @@ fn setup_offering() -> (Env, Address, Address, Address, Address) { let payout_asset = Address::generate(&env); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); (env, contract_id, issuer, token, payout_asset) } diff --git a/src/chunking_tests.rs b/src/chunking_tests.rs index 17f5bb0b2..380620750 100644 --- a/src/chunking_tests.rs +++ b/src/chunking_tests.rs @@ -36,7 +36,7 @@ fn setup_with_offering() -> (Env, RevoraRevenueShareClient, Address, Address, Ad let token = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); // Register offering and fund issuer so deposit_revenue can transfer tokens - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payment_token, &0, &symbol_short!(""), &0); mint_tokens(&env, &payment_token, &issuer, &100_000i128); (env, client, issuer, token, payment_token, pt_admin) } @@ -50,7 +50,7 @@ fn get_revenue_range_chunk_matches_full_sum() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128, &symbol_short!(""), &0); // Report revenue for periods 1..=10 for p in 1u64..=10u64 { @@ -92,7 +92,7 @@ fn get_revenue_range_chunk_inverted_range_returns_zero() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128, &symbol_short!(""), &0); // inverted range: from > to let (sum, next) = client.get_revenue_range_chunk(&issuer, &symbol_short!("def"), &token, &10u64, &1u64, &5u32); @@ -112,7 +112,7 @@ fn get_revenue_range_chunk_cap_clamps_and_returns_next_start() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128, &symbol_short!(""), &0); // Report revenue for periods 1..=201 with amount 1 each for p in 1u64..=201u64 { @@ -143,7 +143,7 @@ fn get_revenue_range_chunk_chunked_iteration_off_by_one_sequence() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000u32, &token, &0i128, &symbol_short!(""), &0); // Report revenue for periods 1..=5 with increasing amounts for easier validation for p in 1u64..=5u64 { @@ -201,7 +201,8 @@ fn pending_periods_page_and_claimable_chunk_consistent() { &1000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); // Mint to issuer so deposit_revenue token transfer succeeds mint_tokens(&env, &payment_token, &issuer, &100_000i128); @@ -326,7 +327,8 @@ fn get_claimable_chunk_table_driven_invariants() { &1000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &payment_token, &issuer, &100_000i128); let test_cases = vec![ @@ -509,7 +511,8 @@ fn get_claimable_chunk_table_driven_invariants() { &1000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &payment_token, &issuer, &100_000i128); // Set up test case conditions @@ -613,7 +616,8 @@ fn get_claimable_chunk_cursor_idempotency_repeated_queries() { &1000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &payment_token, &issuer, &100_000i128); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &10_000); @@ -685,7 +689,8 @@ fn get_claimable_chunk_sum_matches_full_claimable() { &1000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &payment_token, &issuer, &100_000i128); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &5_000); @@ -748,7 +753,8 @@ fn get_claimable_chunk_respects_delay_barrier_parity_with_claim() { &1000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &payment_token, &issuer, &100_000i128); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &10_000); diff --git a/src/invalid_amount_matrix_tests.rs b/src/invalid_amount_matrix_tests.rs index 1d176d89d..b867668bc 100644 --- a/src/invalid_amount_matrix_tests.rs +++ b/src/invalid_amount_matrix_tests.rs @@ -38,7 +38,8 @@ fn setup_offering() -> (Env, Address, Address, Address, Address) { &1_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); (env, contract_id, issuer, token, payout_asset) } @@ -60,7 +61,8 @@ fn setup_funded_offering() -> (Env, Address, Address, Address, Address) { &1_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 1_000_000); (env, contract_id, issuer, token, payment_token) @@ -92,7 +94,8 @@ fn register_offering_rejects_negative_supply_cap_values() { &1_000, &payout_asset, &invalid_cap, - ); + &symbol_short!(""), + &0); assert_eq!(result, Err(Ok(RevoraError::InvalidAmount))); assert_eq!(client.get_offering_count(&issuer, &symbol_short!("def")), 0); assert!(client.get_offering(&issuer, &symbol_short!("def"), &token).is_none()); diff --git a/src/lib.rs b/src/lib.rs index afd6a6190..da7395a50 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -96,6 +96,10 @@ pub enum RevoraError { SnapshotNotFinalized = 49, /// The recomputed snapshot digest does not match the committed `content_hash`. SnapshotHashMismatch = 50, + /// `display_decimals` exceeds the maximum allowed precision of 18. + /// + /// Wire value: 51. Stable since v1. + DisplayDecimalsOutOfRange = 51, /// Payout asset mismatch. PayoutAssetMismatch = 14, /// A transfer is already pending for this offering. @@ -393,6 +397,14 @@ pub struct Offering { /// Cumulative revenue share for all holders in basis points (0-10000). pub revenue_share_bps: u32, pub payout_asset: Address, + /// Human-readable ticker/symbol for the payout denomination (e.g. `USDC`, `XLM`). + /// Used by wallets and dashboards to display amounts without guessing the payment token. + /// Maximum 9 characters (Soroban `Symbol` limit). + pub denomination_symbol: Symbol, + /// Number of decimal places to use when displaying amounts for this offering. + /// Must be ≤ `MAX_TOKEN_DECIMALS` (18) and ≤ the payment token's on-chain decimals. + /// Defaults to 0 when unset. + pub display_decimals: u32, } /// Per-offering concentration guardrail config (#26). @@ -767,6 +779,11 @@ pub enum DataKey2 { /// Sealed-period flag: when present, `report_revenue` overrides are rejected for this period. ClosedPeriod(OfferingId, u64), + + /// Per-offering denomination display metadata (denomination_symbol, display_decimals). + /// Written once at `register_offering` and never mutated. + /// Allows wallets and dashboards to render amounts correctly without guessing token semantics. + DenominationMetadata(OfferingId), } /// Maximum number of offerings returned in a single page. @@ -2326,21 +2343,35 @@ impl RevoraRevenueShare { /// * `issuer` - The address of the offering issuer. Must provide authentication. /// * `namespace` - A symbol identifying the namespace for this offering. /// * `token` - The address of the token being offered. - /// * `revenue_share_bps` - The revenue share percentage in basis points (0–10,000). + /// * `revenue_share_bps` - The revenue share percentage in basis points (0-10,000). /// Values above 10,000 are rejected unless testnet mode is enabled (admin-only, - /// never enable on mainnet — see `TESTNET_MODE.md`). + /// never enable on mainnet - see `TESTNET_MODE.md`). /// * `payout_asset` - The asset in which revenue will be paid out. /// * `supply_cap` - Optional cap on the total amount of revenue that can be deposited (0 = no cap). + /// * `denomination_symbol` - Human-readable ticker for the payout denomination (e.g. `USDC`, `XLM`). + /// Stored as-is; not validated against on-chain token registries. + /// Maximum 9 characters (Soroban `Symbol` limit). + /// * `display_decimals` - Decimal precision wallets should use when displaying amounts. + /// Must satisfy `display_decimals <= MAX_TOKEN_DECIMALS (18)`. + /// Callers should also ensure `display_decimals <= payment_token_decimals`; verify + /// via `get_payment_token_decimals` before calling. /// /// # Returns /// - `Ok(())` on success. /// - `Err(RevoraError::InvalidRevenueShareBps)` if `revenue_share_bps` exceeds 10,000 /// and testnet mode is disabled (the default). + /// - `Err(RevoraError::DisplayDecimalsOutOfRange)` if `display_decimals > 18`. /// - `Err(RevoraError::ContractFrozen)` if the contract is frozen. /// - `Err(RevoraError::ContractPaused)` if the contract is paused. /// /// # Events - /// Emits `EVENT_OFFER_REG_V2` and `EVENT_INDEXED_V2`. + /// Emits `EVENT_OFFER_REG_V2` (payload includes `denomination_symbol` and `display_decimals`) + /// and `EVENT_INDEXED_V2`. + /// + /// # Security note + /// `denomination_symbol` is informational only and does not affect payout math or transfers. + /// Issuers are responsible for providing values consistent with the actual `payout_asset`. + #[allow(clippy::too_many_arguments)] pub fn register_offering( env: Env, issuer: Address, @@ -2349,6 +2380,8 @@ impl RevoraRevenueShare { revenue_share_bps: u32, payout_asset: Address, supply_cap: i128, + denomination_symbol: Symbol, + display_decimals: u32, ) -> Result<(), RevoraError> { Self::require_not_frozen(&env)?; Self::require_not_paused(&env)?; @@ -2361,9 +2394,15 @@ impl RevoraRevenueShare { return Err(err); } + // display_decimals must not exceed the protocol-wide maximum of 18. + // Prevents callers from supplying nonsensical precision that confuses downstream display. + if display_decimals > MAX_TOKEN_DECIMALS { + return Err(RevoraError::DisplayDecimalsOutOfRange); + } + // Skip bps validation in testnet mode (reads the real flag from storage). // In production mode (default) revenue_share_bps is always capped at 10 000 (100%). - // Testnet mode is admin-only and must never be enabled on mainnet — see TESTNET_MODE.md. + // Testnet mode is admin-only and must never be enabled on mainnet - see TESTNET_MODE.md. let testnet_mode = Self::is_testnet_mode(env.clone()); if !testnet_mode && revenue_share_bps > 10_000 { return Err(RevoraError::InvalidRevenueShareBps); @@ -2403,6 +2442,8 @@ impl RevoraRevenueShare { token: token.clone(), revenue_share_bps, payout_asset: payout_asset.clone(), + denomination_symbol: denomination_symbol.clone(), + display_decimals, }; let item_key = DataKey::OfferItem(tenant_id.clone(), count); @@ -2412,6 +2453,12 @@ impl RevoraRevenueShare { // Direct index for O(1) get_offering (#360). env.storage().persistent().set(&DataKey2::OfferingRecord(offering_id.clone()), &offering); + // Denomination metadata auxiliary index: O(1) read for display semantics. + env.storage().persistent().set( + &DataKey2::DenominationMetadata(offering_id.clone()), + &(denomination_symbol.clone(), display_decimals), + ); + let issuer_lookup_key = DataKey::OfferingIssuer(offering_id.clone()); env.storage().persistent().set(&issuer_lookup_key, &issuer); @@ -2420,10 +2467,18 @@ impl RevoraRevenueShare { env.storage().persistent().set(&cap_key, &supply_cap); } + // Primary registration event - denomination metadata included so indexers never + // need a second call to learn display semantics. Self::emit_v2_event( &env, (EVENT_OFFER_REG_V2, issuer.clone(), namespace.clone()), - (token.clone(), revenue_share_bps, payout_asset.clone()), + ( + token.clone(), + revenue_share_bps, + payout_asset.clone(), + denomination_symbol.clone(), + display_decimals, + ), ); env.events().publish( @@ -2447,16 +2502,41 @@ impl RevoraRevenueShare { (EVENT_SCHEMA_VERSION, token.clone(), revenue_share_bps, payout_asset.clone()), ); } - // Versioned v2 event: [2, token, revenue_share_bps, payout_asset] — always emitted (#RC26Q2-C31) + // Versioned v2 event: always emitted (#RC26Q2-C31). + // Payload: (token, revenue_share_bps, payout_asset, denomination_symbol, display_decimals) Self::emit_v2_event( &env, (EVENT_OFFER_REG_V2, issuer, namespace, token.clone()), - (token, revenue_share_bps, payout_asset), + (token, revenue_share_bps, payout_asset, denomination_symbol, display_decimals), ); Ok(()) } + /// Return the denomination display metadata for an offering. + /// + /// This is a cheap O(1) read that does not require iterating offerings. + /// + /// ### Parameters + /// - `issuer`: The issuer address. + /// - `namespace`: The offering namespace. + /// - `token`: The offering token address. + /// + /// ### Returns + /// `Some((denomination_symbol, display_decimals))` if the offering exists, + /// `None` if no offering with that identity has been registered. + pub fn get_denomination_metadata( + env: Env, + issuer: Address, + namespace: Symbol, + token: Address, + ) -> Option<(Symbol, u32)> { + let offering_id = OfferingId { issuer, namespace, token }; + env.storage() + .persistent() + .get::(&DataKey2::DenominationMetadata(offering_id)) + } + /// Fetch a single offering by issuer and token. /// /// This method scans the issuer's registered offerings to find the one matching the given token. @@ -6790,7 +6870,7 @@ mod issue_370_373_tests { let mut tokens = Vec::new(&env); for i in 0..25_u32 { let token = Address::generate(&env); - client.register_offering(&issuer, &namespace, &token, &(1_000 + i), &token, &0); + client.register_offering(&issuer, &namespace, &token, &(1_000 + i), &token, &0, &symbol_short!(""), &0); tokens.push_back(token); } @@ -6861,13 +6941,13 @@ mod issue_370_373_tests { let new_token_0 = Address::generate(&env); let new_token_1 = Address::generate(&env); - client.register_offering(&new_issuer, &namespace, &new_token_0, &1_100, &new_token_0, &0); - client.register_offering(&new_issuer, &namespace, &new_token_1, &1_200, &new_token_1, &0); + client.register_offering(&new_issuer, &namespace, &new_token_0, &1_100, &new_token_0, &0, &symbol_short!(""), &0); + client.register_offering(&new_issuer, &namespace, &new_token_1, &1_200, &new_token_1, &0, &symbol_short!(""), &0); let mut old_tokens = Vec::new(&env); for i in 0..25_u32 { let token = Address::generate(&env); - client.register_offering(&old_issuer, &namespace, &token, &(2_000 + i), &token, &0); + client.register_offering(&old_issuer, &namespace, &token, &(2_000 + i), &token, &0, &symbol_short!(""), &0); old_tokens.push_back(token); } diff --git a/src/milestone_signals.rs b/src/milestone_signals.rs index 01f377447..78b611cf0 100644 --- a/src/milestone_signals.rs +++ b/src/milestone_signals.rs @@ -51,7 +51,7 @@ fn setup_offering(env: &Env, client: &RevoraRevenueShareClient) -> (Address, Add let token = Address::generate(env); let payout = Address::generate(env); client.set_admin(&issuer); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000u32, &payout, &0i128); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000u32, &payout, &0i128, &symbol_short!(""), &0); (issuer, token, payout) } @@ -469,8 +469,8 @@ fn milestone_audit_summary_isolated_per_offering() { let ns = symbol_short!("def"); client.set_admin(&issuer); - client.register_offering(&issuer, &ns, &token_a, &1_000u32, &payout, &0i128); - client.register_offering(&issuer, &ns, &token_b, &1_000u32, &payout, &0i128); + client.register_offering(&issuer, &ns, &token_a, &1_000u32, &payout, &0i128, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns, &token_b, &1_000u32, &payout, &0i128, &symbol_short!(""), &0); client.report_revenue(&issuer, &ns, &token_a, &payout, &5_000i128, &1u64, &false); diff --git a/src/normalize_share_tests.rs b/src/normalize_share_tests.rs index 1a2201987..69255f9dc 100644 --- a/src/normalize_share_tests.rs +++ b/src/normalize_share_tests.rs @@ -20,7 +20,7 @@ fn decimals_bounds_and_default() { let token = Address::generate(&env); let ns = symbol_short!("def"); - client.register_offering(&issuer, &ns, &token, &0u32, &token, &0i128); + client.register_offering(&issuer, &ns, &token, &0u32, &token, &0i128, &symbol_short!(""), &0); assert!(client.try_set_payment_token_decimals(&issuer, &ns, &token, &0u32).is_ok()); assert_eq!(client.get_payment_token_decimals(&issuer, &ns, &token), 0u32); diff --git a/src/proptest_helpers.rs b/src/proptest_helpers.rs index 1f2b064d6..84b8ec1b3 100644 --- a/src/proptest_helpers.rs +++ b/src/proptest_helpers.rs @@ -23,7 +23,7 @@ /// let client = make_client(&env); /// let issuer = Address::generate(&env); /// let token = Address::generate(&env); -/// client.register_offering(&issuer, &symbol_short!("def"), &token, &bps, &token, &0); +/// client.register_offering(&issuer, &symbol_short!("def"), &token, &bps, &token, &0, &symbol_short!(""), &0); /// } /// } /// ``` diff --git a/src/test.rs b/src/test.rs index 380a8ada0..4bcbe094e 100644 --- a/src/test.rs +++ b/src/test.rs @@ -629,7 +629,7 @@ fn get_whitelist_empty_before_any_add() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); for period_id in 1..=100_u64 { client.report_revenue( @@ -841,7 +841,7 @@ fn blacklist_overrides_whitelist() { let investor = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Add to both whitelist and blacklist client.whitelist_add(&issuer, &issuer, &symbol_short!("def"), &token, &investor); @@ -997,7 +997,8 @@ fn register_offering_rejects_bps_over_10000() { &10_001, &payout_asset, &0, - ); + &symbol_short!(""), + &0); assert!( result.is_err(), "contract must return Err(RevoraError::InvalidRevenueShareBps) for bps > 10000" @@ -1021,10 +1022,274 @@ fn register_offering_accepts_bps_exactly_10000() { &10_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); assert!(result.is_ok()); } +// ── denomination metadata ───────────────────────────────────── + +/// denomination_metadata: happy path stores symbol and decimals correctly. +#[test] +fn denomination_metadata_stored_and_readable() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + let sym = symbol_short!("USDC"); + + client.register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &sym, + &6, + ); + + let meta = client.get_denomination_metadata(&issuer, &symbol_short!("def"), &token); + assert!(meta.is_some(), "denomination metadata must be present after register"); + let (stored_sym, stored_dec) = meta.unwrap(); + assert_eq!(stored_sym, sym); + assert_eq!(stored_dec, 6u32); +} + +/// denomination_metadata: display_decimals = 0 is the minimum valid value. +#[test] +fn denomination_metadata_zero_decimals_accepted() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + + let result = client.try_register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &symbol_short!("XLM"), + &0, + ); + assert!(result.is_ok(), "display_decimals=0 must be accepted"); +} + +/// denomination_metadata: display_decimals = 18 (MAX_TOKEN_DECIMALS) is accepted. +#[test] +fn denomination_metadata_max_decimals_accepted() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + + let result = client.try_register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &symbol_short!("WBTC"), + &18, + ); + assert!(result.is_ok(), "display_decimals=18 must be accepted"); + let meta = client.get_denomination_metadata(&issuer, &symbol_short!("def"), &token); + assert_eq!(meta.unwrap().1, 18u32); +} + +/// denomination_metadata: display_decimals = 19 exceeds MAX_TOKEN_DECIMALS — must reject. +#[test] +fn denomination_metadata_rejects_display_decimals_over_18() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + + let result = client.try_register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &symbol_short!("BAD"), + &19, + ); + assert_eq!( + result, + Err(Ok(RevoraError::DisplayDecimalsOutOfRange)), + "display_decimals=19 must return DisplayDecimalsOutOfRange" + ); +} + +/// denomination_metadata: display_decimals = u32::MAX is firmly rejected. +#[test] +fn denomination_metadata_rejects_display_decimals_u32_max() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + + let result = client.try_register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &symbol_short!("BAD"), + &u32::MAX, + ); + assert_eq!( + result, + Err(Ok(RevoraError::DisplayDecimalsOutOfRange)), + "display_decimals=u32::MAX must return DisplayDecimalsOutOfRange" + ); +} + +/// denomination_metadata: no record exists before register — get returns None. +#[test] +fn denomination_metadata_returns_none_before_register() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + + let meta = client.get_denomination_metadata(&issuer, &symbol_short!("def"), &token); + assert!(meta.is_none(), "must return None for unregistered offering"); +} + +/// denomination_metadata: ofr_reg2 event payload includes denomination_symbol and +/// display_decimals so indexers never need a second round-trip. +#[test] +fn denomination_metadata_in_ofr_reg2_event_payload() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + let sym = symbol_short!("USDC"); + + client.register_offering( + &issuer, + &symbol_short!("def"), + &token, + &500, + &payout_asset, + &0, + &sym, + &6, + ); + + // Scan events for ofr_reg2 and verify payload contains denomination fields. + let events = env.events().all(); + let ofr_reg2_sym = symbol_short!("ofr_reg2"); + let mut found = false; + for i in 0..events.len() { + let ev = events.get(i).unwrap(); + let topics: soroban_sdk::Vec = ev.0; + if topics.len() >= 1 { + if let Ok(t) = topics.get(0).unwrap().try_into_val(&env) as Result { + if t == ofr_reg2_sym { + // The payload tuple is (token, revenue_share_bps, payout_asset, + // denomination_symbol, display_decimals). + // We only assert the event was emitted; full XDR payload decode + // is covered by test_indexer_fixtures.rs. + found = true; + break; + } + } + } + } + assert!(found, "ofr_reg2 event must be emitted after register_offering"); +} + +/// denomination_metadata: offering stored in OfferItem and OfferingRecord both carry +/// the new fields — cross-check via get_offering. +#[test] +fn denomination_metadata_reflected_in_get_offering() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + let sym = symbol_short!("USDC"); + + client.register_offering( + &issuer, + &symbol_short!("def"), + &token, + &2_500, + &payout_asset, + &0, + &sym, + &6, + ); + + let offering = client + .get_offering(&issuer, &symbol_short!("def"), &token) + .expect("offering must exist after register"); + assert_eq!(offering.denomination_symbol, sym); + assert_eq!(offering.display_decimals, 6u32); +} + +/// denomination_metadata: validation fires BEFORE the duplicate-prevention check so a +/// call with bad decimals never silently no-ops on a previously registered offering. +#[test] +fn denomination_metadata_validation_before_duplicate_guard() { + let env = Env::default(); + env.mock_all_auths(); + let client = make_client(&env); + let issuer = Address::generate(&env); + let token = Address::generate(&env); + let payout_asset = Address::generate(&env); + + // First registration succeeds. + client.register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &symbol_short!("XLM"), + &7, + ); + + // Second call with bad display_decimals should return the error, not Ok(()). + let result = client.try_register_offering( + &issuer, + &symbol_short!("def"), + &token, + &1_000, + &payout_asset, + &0, + &symbol_short!("XLM"), + &19, + ); + assert_eq!( + result, + Err(Ok(RevoraError::DisplayDecimalsOutOfRange)), + "bad decimals must error even when offering already exists" + ); +} + // ── revenue index ───────────────────────────────────────────── #[test] @@ -1096,7 +1361,7 @@ fn multiple_reports_same_period_accumulate() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); for period_id in 1..=100_u64 { client.report_revenue( @@ -1145,7 +1410,7 @@ fn get_revenue_range_sums_periods() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &payout_asset, &0, &symbol_short!(""), &0); client.report_revenue(&issuer, &symbol_short!("def"), &token, &payout_asset, &100, &1, &false); client.report_revenue(&issuer, &symbol_short!("def"), &token, &payout_asset, &200, &2, &false); assert_eq!(client.get_revenue_range(&issuer, &symbol_short!("def"), &token, &1, &2), 300); @@ -1170,7 +1435,7 @@ fn gas_characterization_report_revenue_with_large_blacklist() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &500, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &500, &payout_asset, &0, &symbol_short!(""), &0); for _ in 0..30 { client.blacklist_add( @@ -1221,7 +1486,7 @@ fn large_period_range_sums_correctly() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.report_revenue(&issuer, &symbol_short!("def"), &token, &token, &1_000, &1, &false); } @@ -1237,7 +1502,7 @@ fn concentration_limit_not_set_allows_report_revenue() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.report_revenue( &issuer, &symbol_short!("def"), @@ -1270,7 +1535,7 @@ fn set_concentration_limit_stores_config() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &false, &0u64); let config = client.get_concentration_limit(&issuer, &symbol_short!("def"), &token); assert_eq!(config.clone().unwrap().max_bps, 5000); @@ -1288,7 +1553,7 @@ fn set_concentration_limit_bounds_check() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let res = client.try_set_concentration_limit(&issuer, &symbol_short!("def"), &token, &10001, &false, &0u64); @@ -1303,7 +1568,7 @@ fn report_concentration_bounds_check() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let res = client.try_report_concentration(&issuer, &symbol_short!("def"), &token, &10001); assert!(res.is_err()); @@ -1320,7 +1585,7 @@ fn set_concentration_limit_respects_pause() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); client.initialize(&admin, &None, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.pause_admin(&admin); let res = @@ -1339,7 +1604,7 @@ fn report_concentration_respects_pause() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); client.initialize(&admin, &None, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.pause_admin(&admin); let res = client.try_report_concentration(&issuer, &symbol_short!("def"), &token, &5000); @@ -1355,7 +1620,7 @@ fn report_concentration_emits_audit_event() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let before = env.events().all().len(); client.report_concentration(&issuer, &symbol_short!("def"), &token, &3000); @@ -1372,7 +1637,7 @@ fn report_concentration_emits_warning_when_over_limit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &false, &0u64); let before = env.events().all().len(); client.report_concentration(&issuer, &symbol_short!("def"), &token, &6000); @@ -1391,7 +1656,7 @@ fn report_concentration_no_warning_when_below_limit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &false, &0u64); client.report_concentration(&issuer, &symbol_short!("def"), &token, &4000); assert_eq!( @@ -1408,7 +1673,7 @@ fn concentration_enforce_blocks_report_revenue_when_over_limit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &0u64); client.report_concentration(&issuer, &symbol_short!("def"), &token, &6000); let r = client.try_report_revenue( @@ -1434,7 +1699,7 @@ fn concentration_enforce_allows_report_revenue_when_at_or_below_limit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &0u64); client.report_concentration(&issuer, &symbol_short!("def"), &token, &5000); client.report_revenue( @@ -1466,7 +1731,7 @@ fn concentration_near_threshold_boundary() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &0u64); client.report_concentration(&issuer, &symbol_short!("def"), &token, &5001); @@ -1507,7 +1772,7 @@ fn set_concentration_limit_requires_auth_before_state_read() { // Register the offering with mocked auth so it exists in storage. env.mock_all_auths(); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Now clear mocked auths — subsequent calls require real auth. let env2 = Env::default(); @@ -1541,7 +1806,7 @@ fn set_concentration_limit_auth_required_even_in_event_only_mode() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // With mock_all_auths the call succeeds (auth is satisfied). let result = client.try_set_concentration_limit( @@ -1570,7 +1835,7 @@ fn set_concentration_limit_wrong_issuer_rejected_after_auth() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // attacker tries to set the limit on issuer's offering. let result = client.try_set_concentration_limit( @@ -1598,7 +1863,7 @@ fn concentration_staleness_no_prior_report_rejected() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // enforce=true, max_staleness_secs=3600 — no report_concentration called yet client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &3600u64); let r = client.try_report_revenue( @@ -1627,7 +1892,7 @@ fn concentration_staleness_stale_report_rejected() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &3600u64); // Report concentration at t=1000 @@ -1662,7 +1927,7 @@ fn concentration_staleness_fresh_report_allowed() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &3600u64); // Report concentration at t=1000 @@ -1692,7 +1957,7 @@ fn concentration_staleness_enforce_off_bypasses_guard() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // enforce=false — staleness guard must not fire client.set_concentration_limit( &issuer, @@ -1724,7 +1989,7 @@ fn concentration_staleness_zero_secs_disables_guard() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // max_staleness_secs=0 — guard disabled client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &0u64); // No report_concentration called — should not be rejected for staleness @@ -1749,7 +2014,7 @@ fn concentration_staleness_boundary_exact_window_allowed() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &3600u64); env.ledger().set_timestamp(1000); @@ -1800,7 +2065,7 @@ fn set_rounding_mode_wrong_issuer_rejected_after_auth() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let result = client.try_set_rounding_mode( &attacker, @@ -1823,7 +2088,7 @@ fn audit_summary_empty_before_any_report() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let summary = client.get_audit_summary(&issuer, &symbol_short!("def"), &token); assert!(summary.is_none()); } @@ -1836,7 +2101,7 @@ fn audit_summary_aggregates_revenue_and_count() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.report_revenue(&issuer, &symbol_short!("def"), &token, &payout_asset, &100, &1, &false); client.report_revenue(&issuer, &symbol_short!("def"), &token, &payout_asset, &200, &2, &false); client.report_revenue(&issuer, &symbol_short!("def"), &token, &payout_asset, &300, &3, &false); @@ -1858,8 +2123,8 @@ fn audit_summary_per_offering_isolation() { let token_b = Address::generate(&env); let payout_asset_a = Address::generate(&env); let payout_asset_b = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_a, &1_000, &payout_asset_a, &0); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &1_000, &payout_asset_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_a, &1_000, &payout_asset_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &1_000, &payout_asset_b, &0, &symbol_short!(""), &0); client.report_revenue( &issuer, &symbol_short!("def"), @@ -1942,14 +2207,14 @@ fn set_and_get_rounding_mode() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); assert_eq!( client.get_rounding_mode(&issuer, &symbol_short!("def"), &token), RoundingMode::Truncation ); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); assert_eq!( client.get_rounding_mode(&issuer, &symbol_short!("def"), &token), RoundingMode::Truncation @@ -2093,7 +2358,7 @@ fn claim_setup() -> (Env, RevoraRevenueShareClient<'static>, Address, Address, A let (payment_token, pt_admin) = create_payment_token(&env); // Register offering - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); // 50% revenue share + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // 50% revenue share // Mint payment tokens to the issuer so they can deposit mint_tokens(&env, &payment_token, &pt_admin, &issuer, &10_000_000); @@ -2130,7 +2395,8 @@ fn register_offering_does_not_lock_payment_token_before_first_deposit() { &5_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); assert_eq!(client.get_payment_token(&issuer, &symbol_short!("def"), &offering_token), None); } @@ -2162,7 +2428,8 @@ fn failed_invalid_first_deposit_does_not_lock_payment_token() { &5_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); let result = client.try_deposit_revenue( &issuer, @@ -2242,7 +2509,7 @@ fn report_revenue_rejects_mismatched_payout_asset() { let payout_asset = Address::generate(&env); let wrong_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let r = client.try_report_revenue( &issuer, &symbol_short!("def"), @@ -2272,7 +2539,8 @@ fn first_deposit_uses_registered_payment_token_lock() { &5_000, &configured_asset, &0, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &configured_asset, &configured_admin, &issuer, &1_000_000); client.deposit_revenue( @@ -2307,7 +2575,8 @@ fn failed_first_deposit_does_not_lock_payment_token_or_consume_period() { &5_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); let failed = client.try_deposit_revenue( &issuer, @@ -2402,7 +2671,7 @@ fn deposit_revenue_rejects_mismatched_token_after_lock() { let (locked_token, locked_admin) = create_payment_token(&env); let (other_token, other_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &locked_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &locked_token, &0, &symbol_short!(""), &0); mint_tokens(&env, &locked_token, &locked_admin, &issuer, &1_000_000); mint_tokens(&env, &other_token, &other_admin, &issuer, &1_000_000); @@ -2440,7 +2709,8 @@ fn deposit_revenue_rejects_wrong_token_on_first_deposit() { &5_000, &configured_token, &0, - ); + &symbol_short!(""), + &0); mint_tokens(&env, &wrong_token, &wrong_admin, &issuer, &1_000_000); // First deposit with wrong token must be rejected @@ -2484,8 +2754,8 @@ fn payment_token_lock_is_per_offering() { let (asset_a, admin_a) = create_payment_token(&env); let (asset_b, admin_b) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_a, &5_000, &asset_a, &0); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &5_000, &asset_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_a, &5_000, &asset_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &5_000, &asset_b, &0, &symbol_short!(""), &0); mint_tokens(&env, &asset_a, &admin_a, &issuer, &1_000_000); mint_tokens(&env, &asset_b, &admin_b, &issuer, &1_000_000); @@ -2522,7 +2792,7 @@ fn payment_token_none_before_first_deposit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let (payout, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); assert_eq!(client.get_payment_token(&issuer, &symbol_short!("def"), &token), None); } @@ -2536,7 +2806,7 @@ fn payment_token_locked_after_first_successful_deposit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let (payout, admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); mint_tokens(&env, &payout, &admin, &issuer, &1_000_000); client.deposit_revenue(&issuer, &symbol_short!("def"), &token, &payout, &100_000, &1); assert_eq!( @@ -2556,7 +2826,7 @@ fn payment_token_mismatch_returns_correct_error_code() { let token = Address::generate(&env); let (payout_a, admin_a) = create_payment_token(&env); let (payout_b, admin_b) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_a, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_a, &0, &symbol_short!(""), &0); mint_tokens(&env, &payout_a, &admin_a, &issuer, &1_000_000); mint_tokens(&env, &payout_b, &admin_b, &issuer, &1_000_000); @@ -2589,7 +2859,7 @@ fn payment_token_not_locked_after_failed_first_deposit() { let issuer = Address::generate(&env); let token = Address::generate(&env); let (payout, admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); // No mint — transfer will fail let r = client.try_deposit_revenue( &issuer, @@ -2680,8 +2950,8 @@ fn multi_offering_different_payment_tokens_independent() { let (payment_token_y, admin_y) = create_payment_token(&env); // Register two offerings in same namespace ("multi") but different tokens - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &payment_token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &payment_token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &payment_token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &payment_token_y, &0, &symbol_short!(""), &0); // Mint tokens for issuer mint_tokens(&env, &payment_token_x, &admin_x, &issuer, &1_000_000); @@ -2726,8 +2996,8 @@ fn multi_offering_cross_deposit_fails_with_payment_token_mismatch() { let (token_y, admin_y) = create_payment_token(&env); let (token_z, admin_z) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); mint_tokens(&env, &token_x, &admin_x, &issuer, &1_000_000); mint_tokens(&env, &token_y, &admin_y, &issuer, &1_000_000); @@ -2781,8 +3051,8 @@ fn multi_offering_cross_deposit_does_not_mutate_state() { let (token_y, admin_y) = create_payment_token(&env); let (token_z, admin_z) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); mint_tokens(&env, &token_x, &admin_x, &issuer, &1_000_000); mint_tokens(&env, &token_y, &admin_y, &issuer, &1_000_000); @@ -2829,8 +3099,8 @@ fn multi_offering_independent_deposits_then_cross_fail() { let (token_y, admin_y) = create_payment_token(&env); let (token_z, admin_z) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); mint_tokens(&env, &token_x, &admin_x, &issuer, &1_000_000); mint_tokens(&env, &token_y, &admin_y, &issuer, &1_000_000); @@ -2877,8 +3147,8 @@ fn multi_offering_same_payment_token_both_offerings() { let (payment_token, admin) = create_payment_token(&env); // Both offerings use the SAME payment token - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &payment_token, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &payment_token, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &payment_token, &0, &symbol_short!(""), &0); mint_tokens(&env, &payment_token, &admin, &issuer, &2_000_000); @@ -2915,8 +3185,8 @@ fn multi_offering_independent_period_sequencing() { let (token_x, admin_x) = create_payment_token(&env); let (token_y, admin_y) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); mint_tokens(&env, &token_x, &admin_x, &issuer, &5_000_000); mint_tokens(&env, &token_y, &admin_y, &issuer, &5_000_000); @@ -2958,8 +3228,8 @@ fn multi_offering_snapshot_deposits_independent() { let (token_x, admin_x) = create_payment_token(&env); let (token_y, admin_y) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); // Enable snapshot for both client.set_snapshot_config(&issuer, &symbol_short!("multi"), &token_a, &true); @@ -3014,7 +3284,7 @@ fn multi_offering_snapshot_locks_payment_token() { let (token_x, admin_x) = create_payment_token(&env); let (token_z, admin_z) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); client.set_snapshot_config(&issuer, &symbol_short!("multi"), &token_a, &true); mint_tokens(&env, &token_x, &admin_x, &issuer, &1_000_000); @@ -3060,9 +3330,9 @@ fn multi_offering_three_offerings_full_isolation() { let (token_z, admin_z) = create_payment_token(&env); // Register three offerings - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_c, &5_000, &token_z, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_c, &5_000, &token_z, &0, &symbol_short!(""), &0); mint_tokens(&env, &token_x, &admin_x, &issuer, &1_000_000); mint_tokens(&env, &token_y, &admin_y, &issuer, &1_000_000); @@ -3117,8 +3387,8 @@ fn multi_offering_interleaved_deposits_maintain_isolation() { let (token_x, admin_x) = create_payment_token(&env); let (token_y, admin_y) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0); - client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_a, &5_000, &token_x, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("multi"), &token_b, &5_000, &token_y, &0, &symbol_short!(""), &0); mint_tokens(&env, &token_x, &admin_x, &issuer, &5_000_000); mint_tokens(&env, &token_y, &admin_y, &issuer, &5_000_000); @@ -3157,7 +3427,7 @@ fn get_payment_token_decimals_defaults_to_7() { let token = Address::generate(&env); let payout = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); assert_eq!(client.get_payment_token_decimals(&issuer, &symbol_short!("def"), &token), 7); } @@ -3172,7 +3442,7 @@ fn set_and_get_payment_token_decimals() { let token = Address::generate(&env); let payout = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); client.set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &6); assert_eq!(client.get_payment_token_decimals(&issuer, &symbol_short!("def"), &token), 6); @@ -3188,7 +3458,7 @@ fn set_payment_token_decimals_rejects_out_of_range() { let token = Address::generate(&env); let payout = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); let result = client.try_set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &19); assert!(result.is_err()); @@ -3204,7 +3474,7 @@ fn set_payment_token_decimals_accepts_max_18() { let token = Address::generate(&env); let payout = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); let result = client.try_set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &18); assert!(result.is_ok()); @@ -3221,7 +3491,7 @@ fn set_payment_token_decimals_accepts_zero() { let token = Address::generate(&env); let payout = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout, &0, &symbol_short!(""), &0); let result = client.try_set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &0); assert!(result.is_ok()); @@ -3242,7 +3512,7 @@ fn claim_normalizes_6_decimal_token_revenue() { let holder = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // Configure 6-decimal token (e.g., USDC) client.set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &6); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &5_000); // 50% @@ -3275,7 +3545,7 @@ fn claim_normalizes_8_decimal_token_revenue() { let holder = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // Configure 8-decimal token (e.g., WBTC) client.set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &8); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &5_000); // 50% @@ -3309,7 +3579,7 @@ fn claim_with_7_decimal_token_is_unchanged() { let holder = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // Default is 7 decimals — no explicit set needed client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &5_000); // 50% @@ -3334,7 +3604,7 @@ fn get_claimable_normalizes_6_decimal_token() { let holder = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); client.set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &6); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &5_000); @@ -3414,7 +3684,7 @@ fn deposit_revenue_exactly_at_supply_cap_succeeds() { let token = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); mint_tokens(&env, &payment_token, &pt_admin, &issuer, &10_000_000); // exactly at cap should succeed @@ -3432,7 +3702,7 @@ fn deposit_revenue_exceeds_supply_cap_fails() { let token = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); mint_tokens(&env, &payment_token, &pt_admin, &issuer, &10_000_000); // Deposit exceeds cap should fail @@ -3450,7 +3720,7 @@ fn deposit_revenue_multiple_deposits_exceeds_supply_cap_fails() { let token = Address::generate(&env); let (payment_token, pt_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); mint_tokens(&env, &payment_token, &pt_admin, &issuer, &10_000_000); client.deposit_revenue(&issuer, &symbol_short!("def"), &token, &payment_token, &50_000, &1); @@ -3468,7 +3738,7 @@ fn set_investment_constraints_succeeds_for_valid_bounds() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); client.set_investment_constraints(&issuer, &symbol_short!("def"), &token, &100, &1_000); let constraints = client.get_investment_constraints(&issuer, &symbol_short!("def"), &token).unwrap(); @@ -3486,7 +3756,7 @@ fn set_investment_constraints_fails_when_max_less_than_min() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); let r = client.try_set_investment_constraints(&issuer, &symbol_short!("def"), &token, &1_000, &100); assert!(r.is_err()); } @@ -3501,7 +3771,7 @@ fn set_investment_constraints_fails_negative() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); let r = client.try_set_investment_constraints(&issuer, &symbol_short!("def"), &token, &-1, &100); assert!(r.is_err()); @@ -3519,7 +3789,7 @@ fn set_investment_constraints_emits_event() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); let before = legacy_events(&env).len(); client.set_investment_constraints(&issuer, &symbol_short!("def"), &token, &100, &1_000); @@ -3547,7 +3817,7 @@ fn register_capped_offering( payment_token: &Address, cap: i128, ) { - client.register_offering(issuer, &symbol_short!("cap"), token, &5_000, payment_token, &cap); + client.register_offering(issuer, &symbol_short!("cap"), token, &5_000, payment_token, &cap, &symbol_short!(""), &0); } #[test] @@ -3560,7 +3830,7 @@ fn get_deposited_revenue_returns_zero_before_any_deposit() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("cap"), &token, &5_000, &payment_token, &100_000); + client.register_offering(&issuer, &symbol_short!("cap"), &token, &5_000, &payment_token, &100_000, &symbol_short!(""), &0); // No deposits yet — read API must return 0. assert_eq!(client.get_deposited_revenue(&issuer, &symbol_short!("cap"), &token), 0); @@ -3598,7 +3868,7 @@ fn deposit_revenue_no_cap_is_unlimited() { let (payment_token, pt_admin) = create_payment_token(&env); // Register with cap = 0 (unlimited). - client.register_offering(&issuer, &symbol_short!("cap"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("cap"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); mint_tokens(&env, &payment_token, &pt_admin, &issuer, &10_000_000_000); let r = client.try_deposit_revenue( @@ -3811,7 +4081,7 @@ fn get_supply_cap_returns_zero_when_no_cap_set() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("cap"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("cap"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); assert_eq!(client.get_supply_cap(&issuer, &symbol_short!("cap"), &token), 0); } @@ -3871,7 +4141,7 @@ fn get_investment_constraints_returns_none_before_set() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // Read API must return None before constraints are configured. assert!( client.get_investment_constraints(&issuer, &symbol_short!("def"), &token).is_none(), @@ -3890,7 +4160,7 @@ fn set_investment_constraints_both_zero_succeeds() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); let r = client.try_set_investment_constraints( &issuer, &symbol_short!("def"), &token, &0, &0, ); @@ -3912,7 +4182,7 @@ fn set_investment_constraints_equal_min_and_max_succeeds() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); let r = client.try_set_investment_constraints( &issuer, &symbol_short!("def"), &token, &1_000, &1_000, ); @@ -3934,7 +4204,7 @@ fn set_investment_constraints_min_zero_max_positive_succeeds() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); let r = client.try_set_investment_constraints( &issuer, &symbol_short!("def"), &token, &0, &5_000, ); @@ -3956,7 +4226,7 @@ fn set_investment_constraints_updates_replace_previous() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); client.set_investment_constraints(&issuer, &symbol_short!("def"), &token, &100, &1_000); client.set_investment_constraints(&issuer, &symbol_short!("def"), &token, &200, &2_000); @@ -3977,7 +4247,7 @@ fn set_investment_constraints_update_event_marks_previous_existed() { let token = Address::generate(&env); let (payment_token, _) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // First call — no previous, event payload should have is_update = false. client.set_investment_constraints(&issuer, &symbol_short!("def"), &token, &100, &1_000); @@ -4919,7 +5189,7 @@ fn offering_isolation_claims_independent() { // Register a second offering let token_b = Address::generate(&env); let (pt_b, pt_b_admin) = create_payment_token(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &3_000, &pt_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &3_000, &pt_b, &0, &symbol_short!(""), &0); // Create a second payment token for offering B mint_tokens(&env, &pt_b, &pt_b_admin, &issuer, &5_000_000); @@ -5367,7 +5637,8 @@ fn frozen_blocks_register_offering() { &1_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); assert!(r.is_err()); } @@ -5449,7 +5720,7 @@ fn freeze_offering_sets_flag_and_emits_event() { fn freeze_offering_blocks_only_target_offering() { let (env, client, issuer, token_a, payment_token, _contract_id) = claim_setup(); let token_b = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &5_000, &payment_token, &0, &symbol_short!(""), &0); let holder = Address::generate(&env); client.freeze_offering(&issuer, &issuer, &symbol_short!("def"), &token_a); @@ -5912,7 +6183,8 @@ fn testnet_mode_allows_bps_over_10000() { &15_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); assert!(result.is_ok()); // Verify offering was registered @@ -5937,7 +6209,8 @@ fn testnet_mode_disabled_rejects_bps_over_10000() { &15_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); assert!(result.is_err()); } @@ -5957,7 +6230,7 @@ fn testnet_mode_skips_concentration_enforcement() { client.set_testnet_mode(&true); // Register offering and set concentration limit with enforcement - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &0u64); client.report_concentration(&issuer, &symbol_short!("def"), &token, &8000); // Over limit @@ -6058,7 +6331,7 @@ fn testnet_mode_disabled_enforces_concentration() { let payout_asset = Address::generate(&env); // Testnet mode disabled (default) - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &true, &0u64); client.report_concentration(&issuer, &symbol_short!("def"), &token, &8000); // Over limit @@ -6089,7 +6362,7 @@ fn testnet_mode_toggle_after_offerings_exist() { let payout_asset2 = Address::generate(&env); // Register offering in normal mode - client.register_offering(&issuer, &symbol_short!("def"), &token1, &5_000, &payout_asset1, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token1, &5_000, &payout_asset1, &0, &symbol_short!(""), &0); // Set admin and enable testnet mode client.set_admin(&admin); @@ -6103,7 +6376,8 @@ fn testnet_mode_toggle_after_offerings_exist() { &20_000, &payout_asset2, &0, - ); + &symbol_short!(""), + &0); assert!(result.is_ok()); // Verify both offerings exist @@ -6126,7 +6400,7 @@ fn testnet_mode_affects_only_validation_not_storage() { client.set_testnet_mode(&true); // Register with high bps - client.register_offering(&issuer, &symbol_short!("def"), &token, &25_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &25_000, &payout_asset, &0, &symbol_short!(""), &0); // Disable testnet mode client.set_testnet_mode(&false); @@ -6152,7 +6426,7 @@ fn testnet_mode_multiple_offerings_with_varied_bps() { let token = Address::generate(&env); let bps = 10_000 + (i * 1_000); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &bps, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &bps, &payout_asset, &0, &symbol_short!(""), &0); } assert_eq!(client.get_offering_count(&issuer, &symbol_short!("def")), 5); @@ -6172,7 +6446,7 @@ fn testnet_mode_concentration_warning_still_emitted() { client.set_admin(&admin); client.set_testnet_mode(&true); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.set_concentration_limit(&issuer, &symbol_short!("def"), &token, &5000, &false, &0u64); // Warning should still be emitted in testnet mode @@ -6609,7 +6883,7 @@ fn issuer_transfer_multiple_offerings_isolation() { let new_issuer_b = Address::generate(&env); // Register second offering - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &3_000, &token_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &3_000, &token_b, &0, &symbol_short!(""), &0); // Propose transfers for both (same issuer for both offerings) client.propose_issuer_transfer(&issuer, &symbol_short!("def"), &token_a, &new_issuer_a); @@ -7883,7 +8157,7 @@ fn issuer_transfer_wrong_address_cannot_accept() { let token2 = Address::generate(&env2); let payout2 = Address::generate(&env2); let new_issuer2 = Address::generate(&env2); - client2.register_offering(&issuer2, &symbol_short!("def"), &token2, &1_000, &payout2, &0); + client2.register_offering(&issuer2, &symbol_short!("def"), &token2, &1_000, &payout2, &0, &symbol_short!(""), &0); client2.propose_issuer_transfer(&issuer2, &symbol_short!("def"), &token2, &new_issuer2); // Pending transfer is to new_issuer2; verify it is stored correctly @@ -8158,7 +8432,7 @@ fn testnet_mode_normal_operations_unaffected() { client.set_testnet_mode(&true); // Normal operations should work as expected - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); client.report_revenue( &issuer, &symbol_short!("def"), @@ -8224,7 +8498,8 @@ fn testnet_mode_pagination_unaffected() { &(1_000 + i * 100), &payout_asset, &0, - ); + &symbol_short!(""), + &0); } // Pagination should work normally @@ -8291,7 +8566,7 @@ fn register_blocked_while_paused() { client.initialize(&admin, &None::
, &None::); client.pause_admin(&admin); assert!(client - .try_register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0) + .try_register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0) .is_err()); } @@ -8306,7 +8581,7 @@ fn report_blocked_while_paused() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.pause_admin(&admin); assert!(client .try_report_revenue( @@ -8358,7 +8633,7 @@ fn blacklist_add_blocked_while_paused() { let investor = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.pause_admin(&admin); assert!(client .try_blacklist_add(&admin, &issuer, &symbol_short!("def"), &token, &investor) @@ -8379,7 +8654,7 @@ fn blacklist_remove_blocked_while_paused() { let investor = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.pause_admin(&admin); assert!(client .try_blacklist_remove(&admin, &issuer, &symbol_short!("def"), &token, &investor) @@ -8393,7 +8668,7 @@ fn large_period_range_sums_correctly_full() { let issuer = Address::generate(&env); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &payout_asset, &0, &symbol_short!(""), &0); for period in 1..=10 { client.report_revenue( &issuer, @@ -8457,7 +8732,7 @@ fn check_invariants_enhanced(env: &Env, client: &RevoraRevenueShareClient, issue if client.is_paused() { // Mutations should be blocked; verify by attempting a mutation let dummy_token = Address::generate(env); - let result = client.try_register_offering(&issuer, &ns, &dummy_token, &1000, &dummy_token, &0); + let result = client.try_register_offering(&issuer, &ns, &dummy_token, &1000, &dummy_token, &0, &symbol_short!(""), &0); assert!(result.is_err(), "Mutations allowed when paused"); } @@ -8493,7 +8768,7 @@ proptest! { for op in seq { match op { TestOperation::RegisterOffering((i, ns, t, bps, pa)) => { - client.register_offering(&i, &ns, &t, &bps, &pa, &0); + client.register_offering(&i, &ns, &t, &bps, &pa, &0, &symbol_short!(""), &0); } TestOperation::ReportRevenue((i, ns, t, pa, amt, pid, ovr)) => { client.report_revenue(&i, &ns, &t, &pa, &amt, &pid, &ovr); @@ -8523,7 +8798,7 @@ proptest! { let ns = symbol_short!("def"); let token = Address::generate(&env); - client.register_offering(&issuer, &ns, &token, &1000, &token.clone(), &0); + client.register_offering(&issuer, &ns, &token, &1000, &token.clone(), &0, &symbol_short!(""), &0); // Execute background sequence for op in seq { @@ -8602,7 +8877,7 @@ proptest! { let token = Address::generate(&env); // Mutations panic post-pause let result = std::panic::catch_unwind(|| { - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token.clone(), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token.clone(), &0, &symbol_short!(""), &0); }); prop_assert!(result.is_err()); } @@ -8623,7 +8898,7 @@ proptest! { ) { let (i, ns, t) = offering; let client = make_client(&env); - client.register_offering(&i, &ns, &t, &1000, &t.clone(), &0); + client.register_offering(&i, &ns, &t, &1000, &t.clone(), &0, &symbol_short!(""), &0); // Blacklist holder client.blacklist_add(&i, &i, &ns, &t.clone(), &holder); @@ -8651,7 +8926,7 @@ proptest! { // Register exactly N offerings for _ in 0..n { let token = Address::generate(&env); - client.register_offering(&issuer, &ns, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); } assert_eq!(client.get_offering_count(&issuer, &ns), n as u32); @@ -8723,7 +8998,7 @@ fn test_offerings_pagination_stress() { for _ in 0..num_offerings { let token = Address::generate(&env); - client.register_offering(&issuer, &ns, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); } // 1. Verify MAX_PAGE_LIMIT enforcement @@ -8760,7 +9035,7 @@ fn test_blacklist_pagination_stress() { let ns = symbol_short!("def"); let token = Address::generate(&env); - client.register_offering(&issuer, &ns, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); let num_blacklisted = 45; for _ in 0..num_blacklisted { @@ -8797,7 +9072,7 @@ fn test_whitelist_pagination_stress() { let ns = symbol_short!("def"); let token = Address::generate(&env); - client.register_offering(&issuer, &ns, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); let num_whitelisted = 45; for _ in 0..num_whitelisted { @@ -8866,7 +9141,7 @@ fn calculate_distribution_bps_100_percent() { let holder = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &10_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &10_000, &token, &0, &symbol_short!(""), &0); let payout = client.calculate_distribution( &caller, @@ -8894,7 +9169,7 @@ fn calculate_distribution_bps_25_percent() { let holder = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &2_500, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &2_500, &token, &0, &symbol_short!(""), &0); let payout = client.calculate_distribution( &caller, @@ -9032,7 +9307,7 @@ fn calculate_distribution_rounds_down() { let holder = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &3_333, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &3_333, &token, &0, &symbol_short!(""), &0); let payout = client.calculate_distribution( &caller, @@ -9058,7 +9333,7 @@ fn calculate_distribution_rounds_down_exact() { let caller = Address::generate(&env); let holder = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &2_500, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &2_500, &token, &0, &symbol_short!(""), &0); let payout = client.calculate_distribution( &caller, @@ -9130,7 +9405,7 @@ fn calculate_distribution_multiple_holders_sum() { let caller = Address::generate(&env); let issuer = caller.clone(); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &token, &0, &symbol_short!(""), &0); let holder_a = Address::generate(&env); let holder_b = Address::generate(&env); @@ -9188,7 +9463,7 @@ fn calculate_distribution_requires_auth() { let holder = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &token, &0, &symbol_short!(""), &0); client.calculate_distribution( &caller, @@ -9220,7 +9495,7 @@ fn calculate_total_distributable_bps_100_percent() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &10_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &10_000, &token, &0, &symbol_short!(""), &0); let total = client.calculate_total_distributable(&issuer, &symbol_short!("def"), &token, &100_000); @@ -9236,7 +9511,7 @@ fn calculate_total_distributable_bps_25_percent() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &2_500, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &2_500, &token, &0, &symbol_short!(""), &0); let total = client.calculate_total_distributable(&issuer, &symbol_short!("def"), &token, &100_000); @@ -9261,7 +9536,7 @@ fn calculate_total_distributable_rounds_down() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &3_333, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &3_333, &token, &0, &symbol_short!(""), &0); let total = client.calculate_total_distributable(&issuer, &symbol_short!("def"), &token, &100); @@ -9302,7 +9577,7 @@ fn calculate_distribution_offering_isolation() { let holder = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &8_000, &token_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &8_000, &token_b, &0, &symbol_short!(""), &0); let payout_a = client.calculate_distribution( &caller, @@ -9334,7 +9609,7 @@ fn calculate_total_distributable_offering_isolation() { let (env, client, issuer, token, _payment_token, _contract_id) = claim_setup(); let token_b = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &8_000, &token_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &8_000, &token_b, &0, &symbol_short!(""), &0); let total_a = client.calculate_total_distributable(&issuer, &symbol_short!("def"), &token, &100_000); @@ -9435,7 +9710,7 @@ fn test_event_only_mode_register_and_report() { assert!(client.is_event_only()); // Register offering should emit event but NOT persist state - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &payout_asset, &0, &symbol_short!(""), &0); // Verify event emitted (skip checking EVENT_INIT) let events = legacy_events(&env); @@ -9526,7 +9801,7 @@ fn test_set_offering_metadata_success() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, "ipfs://QmTest123"); let result = @@ -9542,7 +9817,7 @@ fn test_get_offering_metadata_returns_none_initially() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = client.get_offering_metadata(&issuer, &symbol_short!("def"), &token); assert_eq!(metadata, None); @@ -9556,7 +9831,7 @@ fn test_update_offering_metadata_success() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata1 = SdkString::from_str(&env, "ipfs://QmFirst"); client.set_offering_metadata(&issuer, &symbol_short!("def"), &token, &metadata1); @@ -9575,7 +9850,7 @@ fn test_get_offering_metadata_after_set() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, "https://example.com/metadata.json"); let r = client.try_set_offering_metadata(&issuer, &symbol_short!("def"), &token, &metadata); @@ -9593,7 +9868,7 @@ fn test_set_metadata_requires_auth() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, "ipfs://QmTest"); client.set_offering_metadata(&issuer, &symbol_short!("def"), &token, &metadata); @@ -9625,7 +9900,7 @@ fn test_set_metadata_respects_freeze() { let token = Address::generate(&env); client.initialize(&admin, &None, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); client.freeze(); let metadata = SdkString::from_str(&env, "ipfs://QmTest"); @@ -9646,7 +9921,7 @@ fn test_set_metadata_respects_pause() { let token = Address::generate(&env); client.initialize(&admin, &None, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); client.pause_admin(&admin); let metadata = SdkString::from_str(&env, "ipfs://QmTest"); @@ -9663,7 +9938,7 @@ fn test_set_metadata_empty_string() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, ""); let result = @@ -9682,7 +9957,7 @@ fn test_set_metadata_max_length() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); // Create a 256-byte string (max allowed) let max_str = "a".repeat(256); @@ -9700,7 +9975,7 @@ fn test_set_metadata_oversized_data() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); // Create a 257-byte string (exceeds max) let oversized_str = "a".repeat(257); @@ -9718,7 +9993,7 @@ fn test_set_metadata_repeated_updates() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata_values = ["ipfs://QmTest0", "ipfs://QmTest1", "ipfs://QmTest2", "ipfs://QmTest3", "ipfs://QmTest4"]; @@ -9743,8 +10018,8 @@ fn test_metadata_scoped_per_offering() { let token_a = Address::generate(&env); let token_b = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_a, &1000, &token_a, &0); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &2000, &token_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_a, &1000, &token_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &2000, &token_b, &0, &symbol_short!(""), &0); let metadata_a = SdkString::from_str(&env, "ipfs://QmTokenA"); let metadata_b = SdkString::from_str(&env, "ipfs://QmTokenB"); @@ -9768,7 +10043,7 @@ fn test_metadata_set_emits_event() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let before = legacy_events(&env).len(); let metadata = SdkString::from_str(&env, "ipfs://QmTest"); @@ -9794,7 +10069,7 @@ fn test_metadata_update_emits_event() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata1 = SdkString::from_str(&env, "ipfs://QmFirst"); client.set_offering_metadata(&issuer, &symbol_short!("def"), &token, &metadata1); @@ -9823,7 +10098,7 @@ fn test_metadata_events_include_correct_data() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, "ipfs://QmTest123"); client.set_offering_metadata(&issuer, &symbol_short!("def"), &token, &metadata); @@ -9857,9 +10132,9 @@ fn test_metadata_multiple_offerings_same_issuer() { let token2 = Address::generate(&env); let token3 = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token1, &1000, &token1, &0); - client.register_offering(&issuer, &symbol_short!("def"), &token2, &2000, &token2, &0); - client.register_offering(&issuer, &symbol_short!("def"), &token3, &3000, &token3, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token1, &1000, &token1, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token2, &2000, &token2, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token3, &3000, &token3, &0, &symbol_short!(""), &0); let meta1 = SdkString::from_str(&env, "ipfs://Qm1"); let meta2 = SdkString::from_str(&env, "ipfs://Qm2"); @@ -9883,7 +10158,7 @@ fn test_metadata_after_issuer_transfer() { let new_issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&old_issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&old_issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, "ipfs://QmOriginal"); client.set_offering_metadata(&old_issuer, &symbol_short!("def"), &token, &metadata); @@ -9912,7 +10187,7 @@ fn test_set_metadata_requires_issuer() { let non_issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let metadata = SdkString::from_str(&env, "ipfs://QmTest"); let result = @@ -9928,7 +10203,7 @@ fn test_metadata_ipfs_cid_format() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); // Test typical IPFS CID (46 characters) let ipfs_cid = SdkString::from_str(&env, "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG"); @@ -9948,7 +10223,7 @@ fn test_metadata_https_url_format() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); let https_url = SdkString::from_str(&env, "https://api.example.com/metadata/token123.json"); let result = @@ -9967,7 +10242,7 @@ fn test_metadata_content_hash_format() { let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1000, &token, &0, &symbol_short!(""), &0); // SHA256 hash as hex string let content_hash = SdkString::from_str( @@ -10063,7 +10338,7 @@ mod regression { let payout_asset = Address::generate(&env); // Act: Perform the operation - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Assert: Verify correct behavior let offering = client.get_offering(&issuer, &symbol_short!("def"), &token); @@ -10322,7 +10597,8 @@ mod regression { &1_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); (client, admin, token, payout_asset) } @@ -10764,10 +11040,10 @@ mod regression { let p1 = Address::generate(&env); let p2 = Address::generate(&env); let p3 = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &t0, &100, &p0, &0); - client.register_offering(&issuer, &symbol_short!("def"), &t1, &200, &p1, &0); - client.register_offering(&issuer, &symbol_short!("def"), &t2, &300, &p2, &0); - client.register_offering(&issuer, &symbol_short!("def"), &t3, &400, &p3, &0); + client.register_offering(&issuer, &symbol_short!("def"), &t0, &100, &p0, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &t1, &200, &p1, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &t2, &300, &p2, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &t3, &400, &p3, &0, &symbol_short!(""), &0); let (page, _) = client.get_offerings_page(&issuer, &symbol_short!("def"), &0, &10); assert_eq!(page.len(), 4); assert_eq!(page.get(0).clone().unwrap().token, t0); @@ -10786,10 +11062,10 @@ mod regression { let p1 = Address::generate(&env); let p2 = Address::generate(&env); let p3 = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &t0, &100, &p0, &0); - client.register_offering(&issuer, &symbol_short!("def"), &t1, &200, &p1, &0); - client.register_offering(&issuer, &symbol_short!("def"), &t2, &300, &p2, &0); - client.register_offering(&issuer, &symbol_short!("def"), &t3, &400, &p3, &0); + client.register_offering(&issuer, &symbol_short!("def"), &t0, &100, &p0, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &t1, &200, &p1, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &t2, &300, &p2, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &t3, &400, &p3, &0, &symbol_short!(""), &0); let (page, _) = client.get_offerings_page(&issuer, &symbol_short!("def"), &0, &10); assert_eq!(page.len(), 4); assert_eq!(page.get(0).clone().unwrap().token, t0); @@ -10883,7 +11159,7 @@ mod regression { let v0 = client.get_version(); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); assert_eq!(client.get_version(), v0); } @@ -11026,7 +11302,7 @@ mod regression { let token = Address::generate(&env); let payout = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &500, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &500, &payout, &0, &symbol_short!(""), &0); let result = client.get_offering(&issuer, &symbol_short!("def"), &token); assert!(result.is_some()); @@ -11048,7 +11324,7 @@ mod regression { let mut target_token = Address::generate(&env); for i in 0..10u32 { let t = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &t, &(i * 100), &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &t, &(i * 100), &payout, &0, &symbol_short!(""), &0); if i == 9 { target_token = t; } @@ -11076,7 +11352,8 @@ mod regression { &300, &payout, &0, - ); + &symbol_short!(""), + &0); client.propose_issuer_transfer(&old_issuer, &symbol_short!("def"), &token, &new_issuer); client.accept_issuer_transfer(&new_issuer, &symbol_short!("def"), &token); @@ -11106,7 +11383,8 @@ mod regression { &300, &payout, &0, - ); + &symbol_short!(""), + &0); client.propose_issuer_transfer(&old_issuer, &symbol_short!("def"), &token, &new_issuer); client.accept_issuer_transfer(&new_issuer, &symbol_short!("def"), &token); @@ -11374,7 +11652,7 @@ mod admin_rotation_edge { let payout_asset = Address::generate(&env); let new_admin = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.propose_admin_rotation(&new_admin); client.accept_admin_rotation(&new_admin); @@ -11453,7 +11731,7 @@ mod admin_rotation_integration { let investor = Address::generate(&env); let new_admin = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); client.blacklist_add(&issuer, &issuer, &symbol_short!("def"), &token, &investor); client.propose_admin_rotation(&new_admin); @@ -11842,7 +12120,7 @@ fn test_offerings_page_pagination_25_offerings() { for i in 0..25 { let token = Address::generate(&env); tokens.push_back(token.clone()); - client.register_offering(&issuer1, &ns, &token, &(1000 + i * 100), &token, &0); + client.register_offering(&issuer1, &ns, &token, &(1000 + i * 100), &token, &0, &symbol_short!(""), &0); } // Test 1: Page through with limit=10 @@ -11881,7 +12159,7 @@ fn test_offerings_page_edge_cases() { // Register 10 offerings for i in 0..10 { let token = Address::generate(&env); - client.register_offering(&issuer, &ns, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); } // Edge case 1: start == count (10 offerings, start at 10) @@ -11919,10 +12197,10 @@ fn test_offerings_page_ordering_deterministic() { let t2 = Address::generate(&env); let t3 = Address::generate(&env); - client.register_offering(&issuer, &ns, &t0, &100, &t0, &0); - client.register_offering(&issuer, &ns, &t1, &200, &t1, &0); - client.register_offering(&issuer, &ns, &t2, &300, &t2, &0); - client.register_offering(&issuer, &ns, &t3, &400, &t3, &0); + client.register_offering(&issuer, &ns, &t0, &100, &t0, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns, &t1, &200, &t1, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns, &t2, &300, &t2, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns, &t3, &400, &t3, &0, &symbol_short!(""), &0); // Retrieve all pages and verify ordering let (page1, cursor1) = client.get_offerings_page(&issuer, &ns, &0, &2); @@ -11974,9 +12252,9 @@ fn test_offerings_page_after_issuer_transfer() { let t2 = Address::generate(&env); let t3 = Address::generate(&env); - client.register_offering(&issuer1, &ns, &t1, &100, &t1, &0); - client.register_offering(&issuer1, &ns, &t2, &200, &t2, &0); - client.register_offering(&issuer1, &ns, &t3, &300, &t3, &0); + client.register_offering(&issuer1, &ns, &t1, &100, &t1, &0, &symbol_short!(""), &0); + client.register_offering(&issuer1, &ns, &t2, &200, &t2, &0, &symbol_short!(""), &0); + client.register_offering(&issuer1, &ns, &t3, &300, &t3, &0, &symbol_short!(""), &0); // Verify issuer1 has 3 offerings let (page1_before, _) = client.get_offerings_page(&issuer1, &ns, &0, &20); @@ -12013,7 +12291,7 @@ fn test_issuer_transfer_migrates_all_configs() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&old_issuer, &ns, &token, &1000, &payout_asset, &0); + client.register_offering(&old_issuer, &ns, &token, &1000, &payout_asset, &0, &symbol_short!(""), &0); // 1. Set concentration client.set_concentration_limit(&old_issuer, &ns, &token, &5000, &true); diff --git a/src/test_auth.rs b/src/test_auth.rs index 565fa5e78..647171d14 100644 --- a/src/test_auth.rs +++ b/src/test_auth.rs @@ -100,7 +100,7 @@ fn setup_offering(env: &Env, client: &RevoraRevenueShareClient) -> (Address, Add let issuer = Address::generate(env); let token = Address::generate(env); client.set_admin(&issuer); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); (issuer, token) } @@ -564,7 +564,8 @@ fn register_offering_missing_auth_no_mutation() { &1_000, &token, &0, - ); + &symbol_short!(""), + &0); assert!(result.is_err()); assert_eq!(client.get_offering_count(&issuer, &symbol_short!("def")), 0); assert_eq!( @@ -619,7 +620,7 @@ fn blacklist_remove_wrong_caller_no_mutation() { let token = Address::generate(&env); let investor = Address::generate(&env); client.set_admin(&issuer); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.blacklist_add(&issuer, &issuer, &symbol_short!("def"), &token, &investor); let attacker = Address::generate(&env); // Any authenticated caller can remove; with mock_all_auths this succeeds. @@ -668,8 +669,8 @@ fn cross_offering_confusion_wrong_issuer_no_mutation() { let token_b = Address::generate(&env); let holder = Address::generate(&env); - client.register_offering(&issuer_a, &symbol_short!("def"), &token_a, &1_000, &token_a, &0); - client.register_offering(&issuer_b, &symbol_short!("def"), &token_b, &1_000, &token_b, &0); + client.register_offering(&issuer_a, &symbol_short!("def"), &token_a, &1_000, &token_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer_b, &symbol_short!("def"), &token_b, &1_000, &token_b, &0, &symbol_short!(""), &0); // Issuer B tries to set a share on Issuer A's token. let result = client.try_set_holder_share( @@ -698,8 +699,8 @@ fn cross_offering_concentration_limit_wrong_issuer() { let token_a = Address::generate(&env); let token_b = Address::generate(&env); - client.register_offering(&issuer_a, &symbol_short!("def"), &token_a, &1_000, &token_a, &0); - client.register_offering(&issuer_b, &symbol_short!("def"), &token_b, &1_000, &token_b, &0); + client.register_offering(&issuer_a, &symbol_short!("def"), &token_a, &1_000, &token_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer_b, &symbol_short!("def"), &token_b, &1_000, &token_b, &0, &symbol_short!(""), &0); let result = client.try_set_concentration_limit( &issuer_a, @@ -729,7 +730,7 @@ fn cross_namespace_confusion_wrong_namespace() { let holder = Address::generate(&env); // Register only in namespace "ns1". - client.register_offering(&issuer, &symbol_short!("ns1"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("ns1"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // Attempt to set a share in the unregistered namespace "ns2". let result = client.try_set_holder_share( @@ -824,7 +825,8 @@ fn register_offering_blocked_when_frozen() { &1_000, &token, &0, - ); + &symbol_short!(""), + &0); assert_eq!(result, Err(Ok(RevoraError::ContractFrozen))); } @@ -973,7 +975,8 @@ fn register_offering_invalid_bps_returns_typed_error() { &10_001u32, &token, &0, - ); + &symbol_short!(""), + &0); assert_eq!(result, Err(Ok(RevoraError::InvalidRevenueShareBps))); assert_eq!(client.get_offering_count(&issuer, &symbol_short!("def")), 0); } @@ -1071,8 +1074,8 @@ fn two_issuers_independent_settings() { let token_b = Address::generate(&env); let holder = Address::generate(&env); - client.register_offering(&issuer_a, &symbol_short!("def"), &token_a, &1_000, &token_a, &0); - client.register_offering(&issuer_b, &symbol_short!("def"), &token_b, &2_000, &token_b, &0); + client.register_offering(&issuer_a, &symbol_short!("def"), &token_a, &1_000, &token_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer_b, &symbol_short!("def"), &token_b, &2_000, &token_b, &0, &symbol_short!(""), &0); // Issuer A sets a holder share. client.set_holder_share(&issuer_a, &symbol_short!("def"), &token_a, &holder, &1_000u32); diff --git a/src/test_blacklist_batch_gas.rs b/src/test_blacklist_batch_gas.rs index 4575eefa8..86b7d4e40 100644 --- a/src/test_blacklist_batch_gas.rs +++ b/src/test_blacklist_batch_gas.rs @@ -21,7 +21,7 @@ fn blacklist_add_many_gas_bound_worst_case() { // Initialize and register offering client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1000u32, &token, &0_i128); + client.register_offering(&issuer, &ns, &token, &1000u32, &token, &0_i128, &symbol_short!(""), &0); // Prefill blacklist to half the default cap (MAX_BLACKLIST_SIZE = 200 -> 100) let mut prefilled: Vec
= Vec::new(&env); diff --git a/src/test_claim_transfer_fail.rs b/src/test_claim_transfer_fail.rs index 0087d0f17..52d1d0f62 100644 --- a/src/test_claim_transfer_fail.rs +++ b/src/test_claim_transfer_fail.rs @@ -226,7 +226,8 @@ fn setup_claim_fail() -> ( &10_000, &fail_token_id, &0, - ); + &symbol_short!(""), + &0); revora.set_holder_share(&issuer, &symbol_short!("def"), &offering_token, &holder, &10_000); // Mint to issuer and deposit — transfer direction is issuer→contract, not yet failing @@ -447,7 +448,8 @@ fn claim_transfer_fail_does_not_affect_sibling_offering() { &10_000, &0, - ); + &symbol_short!(""), + &0); revora.set_holder_share(&issuer, &symbol_short!("def"), &offering_token_b, &holder, &10_000); revora.deposit_revenue( &issuer, diff --git a/src/test_close_period.rs b/src/test_close_period.rs index b376be7ed..52bc6cf93 100644 --- a/src/test_close_period.rs +++ b/src/test_close_period.rs @@ -60,7 +60,8 @@ fn setup_offering() -> (Env, RevoraRevenueShareClient<'static>, Address, Address &10_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); (env, client, issuer, offering_token, payment_token) } diff --git a/src/test_cross_contract.rs b/src/test_cross_contract.rs index 3cfee4898..95d1137a3 100644 --- a/src/test_cross_contract.rs +++ b/src/test_cross_contract.rs @@ -193,7 +193,7 @@ fn cross_contract_registry_check_before_offering() { // Step 3: Now register offering in Revora (after registry approval) // In production, register_offering would call registry.is_approved() internally assert!(registry.is_approved(&token)); - revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); // Verify offering was created let offering = revora.get_offering(&issuer, &symbol_short!("def"), &token); @@ -285,7 +285,7 @@ fn cross_contract_oracle_revenue_valuation() { let payout_asset = Address::generate(&env); // Register offering - revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); // Report revenue revora.report_revenue( @@ -356,7 +356,7 @@ fn cross_contract_full_workflow_registry_then_offering() { assert!(registry.is_approved(&token)); // Step 3: Register offering in Revora - revora.register_offering(&issuer, &symbol_short!("def"), &token, &3_000, &payout_asset, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token, &3_000, &payout_asset, &0, &symbol_short!(""), &0); // Step 4: Report revenue revora.report_revenue( @@ -430,7 +430,7 @@ fn cross_contract_error_in_registry_does_not_affect_revora() { // Register token and offering registry.register_token(&admin, &token); - revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); // Cause an error in registry (duplicate registration) let err = registry.try_register_token(&admin, &token); @@ -458,7 +458,7 @@ fn cross_contract_revora_operations_independent_of_oracle_state() { let payout_asset = Address::generate(&env); // Revora works fine without any oracle prices set - revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); revora.report_revenue( &issuer, &symbol_short!("def"), @@ -502,13 +502,13 @@ fn cross_contract_concurrent_state_changes() { let payout_3 = Address::generate(&env); registry.register_token(&admin, &token_1); - revora.register_offering(&issuer, &symbol_short!("def"), &token_1, &1_000, &payout_1, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token_1, &1_000, &payout_1, &0, &symbol_short!(""), &0); registry.register_token(&admin, &token_2); - revora.register_offering(&issuer, &symbol_short!("def"), &token_2, &2_000, &payout_2, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token_2, &2_000, &payout_2, &0, &symbol_short!(""), &0); registry.register_token(&admin, &token_3); - revora.register_offering(&issuer, &symbol_short!("def"), &token_3, &3_000, &payout_3, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token_3, &3_000, &payout_3, &0, &symbol_short!(""), &0); // Verify both contracts have consistent state assert_eq!(registry.get_token_count(), 3); @@ -542,7 +542,7 @@ fn cross_contract_oracle_price_updates_across_revenue_reports() { let token = Address::generate(&env); let payout_asset = Address::generate(&env); - revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + revora.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); // Report revenue at $1.00 revora.report_revenue( @@ -624,7 +624,8 @@ fn cross_contract_stress_revora_with_registry_and_oracle() { &((i + 1) * 1_000), &payout, &0, - ); + &symbol_short!(""), + &0); oracle.set_price(&admin, &payout, &((i as i128 + 1) * 1_000_000), &1000); revora.report_revenue( &issuer, diff --git a/src/test_cross_contract_transfer_fail.rs b/src/test_cross_contract_transfer_fail.rs index be4cc1066..9b0faf518 100644 --- a/src/test_cross_contract_transfer_fail.rs +++ b/src/test_cross_contract_transfer_fail.rs @@ -85,7 +85,8 @@ fn setup() -> (Env, RevoraRevenueShareClient<'static>, Address, Address, Address &5_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); (env, client, contract_id, issuer, offering_token, payment_token, pt_admin) } @@ -427,7 +428,8 @@ fn transfer_fail_in_one_offering_does_not_affect_sibling_offering() { &5_000, &payment_token_b, &0, - ); + &symbol_short!(""), + &0); // Fund only offering B mint(&env, &payment_token_b, &issuer, 100_000); diff --git a/src/test_duplicates.rs b/src/test_duplicates.rs index abf27e835..bed1075cf 100644 --- a/src/test_duplicates.rs +++ b/src/test_duplicates.rs @@ -27,7 +27,7 @@ fn setup_offering() -> (Env, RevoraRevenueShareClient<'static>, Address, Address let payout_asset = Address::generate(&env); let namespace = symbol_short!("ns"); - client.register_offering(&issuer, &namespace, &token, &5000, &payout_asset, &0); + client.register_offering(&issuer, &namespace, &token, &5000, &payout_asset, &0, &symbol_short!(""), &0); (env, client, issuer, token, payout_asset) } @@ -52,14 +52,14 @@ fn test_register_duplicate_offering_is_idempotent() { let payout_asset = Address::generate(&env); // First registration - client.register_offering(&issuer, &namespace, &token, &5000, &payout_asset, &0); + client.register_offering(&issuer, &namespace, &token, &5000, &payout_asset, &0, &symbol_short!(""), &0); assert_eq!(client.get_offering_count(&issuer, &namespace), 1); let offering1 = client.get_offering(&issuer, &namespace, &token).unwrap(); assert_eq!(offering1.revenue_share_bps, 5000); // Second registration (same identity, different bps) - client.register_offering(&issuer, &namespace, &token, &6000, &payout_asset, &0); + client.register_offering(&issuer, &namespace, &token, &6000, &payout_asset, &0, &symbol_short!(""), &0); // Count should still be 1 assert_eq!(client.get_offering_count(&issuer, &namespace), 1); @@ -79,9 +79,9 @@ fn test_pagination_stability_with_idempotency() { let token_b = Address::generate(&env); // Register A, then B, then A again - client.register_offering(&issuer, &namespace, &token_a, &1000, &payout_asset, &0); - client.register_offering(&issuer, &namespace, &token_b, &2000, &payout_asset, &0); - client.register_offering(&issuer, &namespace, &token_a, &3000, &payout_asset, &0); + client.register_offering(&issuer, &namespace, &token_a, &1000, &payout_asset, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &namespace, &token_b, &2000, &payout_asset, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &namespace, &token_a, &3000, &payout_asset, &0, &symbol_short!(""), &0); let (offerings, _) = client.get_offerings_page(&issuer, &namespace, &0, &10); @@ -98,8 +98,8 @@ fn test_get_offering_matches_first_registration() { let namespace = symbol_short!("ns"); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &namespace, &token, &1000, &payout_asset, &0); - client.register_offering(&issuer, &namespace, &token, &2000, &payout_asset, &0); + client.register_offering(&issuer, &namespace, &token, &1000, &payout_asset, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &namespace, &token, &2000, &payout_asset, &0, &symbol_short!(""), &0); let offering = client.get_offering(&issuer, &namespace, &token).unwrap(); assert_eq!(offering.revenue_share_bps, 1000); diff --git a/src/test_event_indexed_v2.rs b/src/test_event_indexed_v2.rs index 1488b8557..539170ac0 100644 --- a/src/test_event_indexed_v2.rs +++ b/src/test_event_indexed_v2.rs @@ -37,7 +37,7 @@ fn setup() -> (Env, RevoraRevenueShareClient<'static>, Address, Symbol, Address, let token = Address::generate(&env); let payout = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &2500, &payout, &0); + client.register_offering(&issuer, &ns, &token, &2500, &payout, &0, &symbol_short!(""), &0); (env, client, issuer, ns, token, payout) } @@ -205,7 +205,7 @@ fn event_indexed_v2_claim_topic_and_data_shape() { soroban_sdk::token::StellarAssetClient::new(&env, &payout).mint(&issuer, &1_000_000); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &2500, &payout, &0); + client.register_offering(&issuer, &ns, &token, &2500, &payout, &0, &symbol_short!(""), &0); let holder = Address::generate(&env); client.deposit_revenue(&issuer, &ns, &token, &payout, &100_000, &1); @@ -243,7 +243,7 @@ fn event_indexed_v2_claim_period_id_always_zero() { soroban_sdk::token::StellarAssetClient::new(&env, &payout).mint(&issuer, &1_000_000); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &2500, &payout, &0); + client.register_offering(&issuer, &ns, &token, &2500, &payout, &0, &symbol_short!(""), &0); let holder = Address::generate(&env); client.deposit_revenue(&issuer, &ns, &token, &payout, &100_000, &1); @@ -273,8 +273,8 @@ fn event_indexed_v2_payout_asset_bound_correctly_per_offering() { let payout_a = Address::generate(&env); let payout_b = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &ns, &token_a, &2500, &payout_a, &0); - client.register_offering(&issuer, &ns, &token_b, &2500, &payout_b, &0); + client.register_offering(&issuer, &ns, &token_a, &2500, &payout_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns, &token_b, &2500, &payout_b, &0, &symbol_short!(""), &0); let before_a = env.events().all().len(); client.report_revenue(&issuer, &ns, &token_a, &payout_a, &10_000, &1, &false); diff --git a/src/test_freeze_matrix.rs b/src/test_freeze_matrix.rs index 110b7fd14..28ee09047 100644 --- a/src/test_freeze_matrix.rs +++ b/src/test_freeze_matrix.rs @@ -80,7 +80,7 @@ fn frozen_setup( let issuer = admin.clone(); let token = Address::generate(env); let payout_asset = Address::generate(env); - client.register_offering(&issuer, &symbol_short!("ns"), &token, &1_000u32, &payout_asset, &0i128); + client.register_offering(&issuer, &symbol_short!("ns"), &token, &1_000u32, &payout_asset, &0i128, &symbol_short!(""), &0); // Freeze the contract — all subsequent mutating calls must return ContractFrozen. client.freeze(); @@ -102,7 +102,8 @@ fn frozen_register_offering_returns_contract_frozen() { &500u32, &payout_asset, &0i128, - ); + &symbol_short!(""), + &0); assert_frozen_err(result); // Verify no partial write: offering must not exist. assert!(client.get_offering(&issuer, &symbol_short!("ns2"), &new_token).is_none()); @@ -482,7 +483,7 @@ fn frozen_claim_is_not_blocked() { let issuer = admin.clone(); let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("ns"), &token, &1_000u32, &payout_asset, &0i128); + client.register_offering(&issuer, &symbol_short!("ns"), &token, &1_000u32, &payout_asset, &0i128, &symbol_short!(""), &0); let holder = Address::generate(&env); client.set_holder_share(&issuer, &symbol_short!("ns"), &token, &holder, &1_000u32); diff --git a/src/test_indexer_fixtures.rs b/src/test_indexer_fixtures.rs index 8ea046b81..f58a8a76f 100644 --- a/src/test_indexer_fixtures.rs +++ b/src/test_indexer_fixtures.rs @@ -16,7 +16,7 @@ fn setup_with_offering(env: &Env) -> (RevoraRevenueShareClient, Address, Address let token = Address::generate(env); let payout_asset = Address::generate(env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&admin, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&admin, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); (client, admin, token, payout_asset) } @@ -130,7 +130,7 @@ fn register_offering_emits_ofr_reg2_v2_event() { client.initialize(&admin, &None::
, &None::); let before = env.events().all().len(); - client.register_offering(&admin, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&admin, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let events = env.events().all(); assert!(events.len() > before, "register_offering must emit at least one event"); @@ -156,7 +156,7 @@ fn register_offering_v2_event_data_starts_with_version_2() { client.initialize(&admin, &None::
, &None::); let before = env.events().all().len(); - client.register_offering(&admin, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&admin, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); let events = env.events().all(); let new_events = events.slice(before as u32..); diff --git a/src/test_min_revenue_threshold_boundary.rs b/src/test_min_revenue_threshold_boundary.rs index f2f961ff7..6df72548c 100644 --- a/src/test_min_revenue_threshold_boundary.rs +++ b/src/test_min_revenue_threshold_boundary.rs @@ -32,7 +32,7 @@ fn setup() -> (Env, Address, Address, Address, Address) { let token = Address::generate(&env); let payout = Address::generate(&env); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout, &0, &symbol_short!(""), &0); (env, contract_id, issuer, token, payout) } diff --git a/src/test_namespaces.rs b/src/test_namespaces.rs index dcfe444fc..9ac365582 100644 --- a/src/test_namespaces.rs +++ b/src/test_namespaces.rs @@ -25,9 +25,9 @@ fn test_namespace_isolation() { let ns_2 = symbol_short!("ns2"); // Issuer A registers in ns1 - client.register_offering(&issuer_a, &ns_1, &token, &1000, &token, &0); + client.register_offering(&issuer_a, &ns_1, &token, &1000, &token, &0, &symbol_short!(""), &0); // Issuer B registers in ns2 with SAME token - client.register_offering(&issuer_b, &ns_2, &token, &2000, &token, &0); + client.register_offering(&issuer_b, &ns_2, &token, &2000, &token, &0, &symbol_short!(""), &0); // Set holder shares differently let holder = Address::generate(&env); @@ -64,8 +64,8 @@ fn test_same_issuer_different_namespaces() { let ns_1 = symbol_short!("prod"); let ns_2 = symbol_short!("stg"); - client.register_offering(&issuer, &ns_1, &token, &1000, &token, &0); - client.register_offering(&issuer, &ns_2, &token, &2000, &token, &0); + client.register_offering(&issuer, &ns_1, &token, &1000, &token, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns_2, &token, &2000, &token, &0, &symbol_short!(""), &0); client.set_snapshot_config(&issuer, &ns_1, &token, &true); client.set_snapshot_config(&issuer, &ns_2, &token, &false); @@ -88,8 +88,8 @@ fn test_cross_namespace_blacklist_isolation() { let investor = Address::generate(&env); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns_1, &token, &1000, &token, &0); - client.register_offering(&issuer, &ns_2, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns_1, &token, &1000, &token, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns_2, &token, &1000, &token, &0, &symbol_short!(""), &0); // Blacklist in NS 1 client.blacklist_add(&issuer, &issuer, &ns_1, &token, &investor); @@ -131,7 +131,7 @@ fn test_unauthorized_issuer_access_fails() { let token = Address::generate(&env); let ns_1 = symbol_short!("ns1"); - client.register_offering(&issuer_real, &ns_1, &token, &1000, &token, &0); + client.register_offering(&issuer_real, &ns_1, &token, &1000, &token, &0, &symbol_short!(""), &0); // Attacker tries to blacklist for real issuer's offering // Note: mock_all_auths will allow the call to reach the contract, @@ -165,7 +165,7 @@ fn test_transfer_maintains_namespace_isolation() { let token_1 = Address::generate(&env); let ns_1 = symbol_short!("ns1"); - client.register_offering(&issuer_a, &ns_1, &token_1, &1000, &token_1, &0); + client.register_offering(&issuer_a, &ns_1, &token_1, &1000, &token_1, &0, &symbol_short!(""), &0); client.set_claim_delay(&issuer_a, &ns_1, &token_1, &3600); // Transfer to Issuer B @@ -198,10 +198,10 @@ fn test_duplicate_registration_fails() { let ns = symbol_short!("ns1"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1000, &token, &0); + client.register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); // Exact same registration should fail - let res = client.try_register_offering(&issuer, &ns, &token, &1000, &token, &0); + let res = client.try_register_offering(&issuer, &ns, &token, &1000, &token, &0, &symbol_short!(""), &0); assert!(res.is_err()); } @@ -220,8 +220,8 @@ fn test_aggregation_across_namespaces() { let ns_2 = symbol_short!("stg"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns_1, &token1, &1000, &token1, &0); - client.register_offering(&issuer, &ns_2, &token2, &1000, &token2, &0); + client.register_offering(&issuer, &ns_1, &token1, &1000, &token1, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &ns_2, &token2, &1000, &token2, &0, &symbol_short!(""), &0); // Report revenue in both namespaces client.report_revenue(&issuer, &ns_1, &token1, &token1, &50000, &1, &false); @@ -252,7 +252,7 @@ fn test_blacklist_precedence_over_whitelist() { // Initialize and register offering client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Add investor to whitelist first client.whitelist_add(&issuer, &issuer, &ns, &token, &investor); @@ -296,7 +296,7 @@ fn test_blacklist_unaffected_by_whitelist_removal() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Add to both lists client.whitelist_add(&issuer, &issuer, &ns, &token, &investor); @@ -325,7 +325,7 @@ fn test_blacklist_removal_doesnt_whitelist() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Blacklist investor client.blacklist_add(&issuer, &issuer, &ns, &token, &investor); @@ -353,7 +353,7 @@ fn test_blacklist_add_idempotent() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Add to blacklist multiple times client.blacklist_add(&issuer, &issuer, &ns, &token, &investor); @@ -379,7 +379,7 @@ fn test_blacklist_remove_idempotent() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Remove from empty blacklist multiple times (should not panic) client.blacklist_remove(&issuer, &issuer, &ns, &token, &investor); @@ -407,7 +407,7 @@ fn test_mixed_sequence_with_share_updates() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Set initial shares client.set_holder_share(&issuer, &ns, &token, &holder_a, &5000); @@ -476,7 +476,7 @@ fn test_whitelist_only_mode() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Add only one address to whitelist client.whitelist_add(&issuer, &issuer, &ns, &token, &whitelisted); @@ -532,7 +532,7 @@ fn test_blacklist_only_mode() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Add only one address to blacklist client.blacklist_add(&issuer, &issuer, &ns, &token, &blacklisted); @@ -587,7 +587,7 @@ fn test_complex_add_remove_sequence() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Complex sequence client.blacklist_add(&issuer, &issuer, &ns, &token, &investor); @@ -636,7 +636,7 @@ fn test_multiple_investors_precedence() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // inv_a: whitelisted only client.whitelist_add(&issuer, &issuer, &ns, &token, &inv_a); @@ -711,7 +711,7 @@ fn test_whitelist_disable_changes_eligibility() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // Enable whitelist client.whitelist_add(&issuer, &issuer, &ns, &token, &whitelisted); @@ -771,7 +771,7 @@ fn test_no_lists_all_eligible() { let ns = symbol_short!("def"); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &ns, &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); // No blacklist or whitelist entries assert!(!client.is_whitelist_enabled(&issuer, &ns, &token)); diff --git a/src/test_override_audit_trail.rs b/src/test_override_audit_trail.rs index da0085fed..55de778ed 100644 --- a/src/test_override_audit_trail.rs +++ b/src/test_override_audit_trail.rs @@ -46,7 +46,7 @@ fn setup() -> (Env, Address, Address, Address, Address) { let token = Address::generate(&env); let payout_asset = Address::generate(&env); client.initialize(&issuer, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &payout_asset, &0, &symbol_short!(""), &0); (env, contract_id, issuer, token, payout_asset) } diff --git a/src/test_pause_tiers.rs b/src/test_pause_tiers.rs index 8efa814b9..550ac99c8 100644 --- a/src/test_pause_tiers.rs +++ b/src/test_pause_tiers.rs @@ -71,7 +71,8 @@ fn setup_with_offering( &10_000, &payment_token.address(), &0, - ); + &symbol_short!(""), + &0); client.set_holder_share(&issuer, &symbol_short!("def"), &offering_token, &holder, &10_000); // Mint to issuer and deposit period 1 @@ -229,7 +230,7 @@ fn soft_pause_register_offering_blocked() { let issuer = Address::generate(&env); let token = Address::generate(&env); let result = - client.try_register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.try_register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); assert_eq!(result, Err(Ok(RevoraError::ContractPaused))); } @@ -304,7 +305,7 @@ fn hard_pause_register_offering_blocked() { let issuer = Address::generate(&env); let token = Address::generate(&env); let result = - client.try_register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.try_register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); assert_eq!(result, Err(Ok(RevoraError::ContractPaused))); } diff --git a/src/test_period_id_boundary.rs b/src/test_period_id_boundary.rs index 0da7913cf..3d01a96c8 100644 --- a/src/test_period_id_boundary.rs +++ b/src/test_period_id_boundary.rs @@ -66,7 +66,8 @@ fn setup_funded() -> (Env, RevoraRevenueShareClient<'static>, Address, Address, &1_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 1_000_000_000); (env, client, issuer, offering_token, payment_token) } @@ -82,7 +83,7 @@ fn report_revenue_zero_period_id_rejected() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let result = client.try_report_revenue(&issuer, &symbol_short!("def"), &token, &token, &100, &0, &false); @@ -181,7 +182,7 @@ fn report_revenue_period_id_one_accepted() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let result = client.try_report_revenue(&issuer, &symbol_short!("def"), &token, &token, &500, &1, &false); @@ -196,7 +197,7 @@ fn report_revenue_period_id_max_rejected() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let result = client.try_report_revenue( &issuer, @@ -218,7 +219,7 @@ fn report_revenue_period_id_near_max_rejected() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let result = client.try_report_revenue( &issuer, @@ -337,7 +338,7 @@ fn report_revenue_duplicate_without_override_no_state_change() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client .report_revenue(&issuer, &symbol_short!("def"), &token, &token, &500, &7, &false) @@ -361,7 +362,7 @@ fn report_revenue_duplicate_with_override_updates_state() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client .report_revenue(&issuer, &symbol_short!("def"), &token, &token, &500, &7, &false) @@ -388,7 +389,7 @@ fn negative_amount_rejected_before_period_id_check() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // Negative amount with valid period_id let r = @@ -404,7 +405,7 @@ fn zero_amount_accepted_by_report_revenue() { let client = make_client(&env); let issuer = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_report_revenue(&issuer, &symbol_short!("def"), &token, &token, &0, &3, &false); @@ -439,7 +440,7 @@ fn report_revenue_wrong_issuer_rejected() { let issuer = Address::generate(&env); let attacker = Address::generate(&env); let token = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_report_revenue( &attacker, @@ -495,7 +496,8 @@ fn period_id_isolated_across_offerings() { &1_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); client.register_offering( &issuer_b, &symbol_short!("def"), @@ -503,7 +505,8 @@ fn period_id_isolated_across_offerings() { &1_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer_a, 1_000_000); mint(&env, &payment_token, &issuer_b, 1_000_000); @@ -536,8 +539,8 @@ fn report_revenue_period_id_isolated_across_offerings() { let token_a = Address::generate(&env); let token_b = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token_a, &1_000, &token_a, &0); - client.register_offering(&issuer, &symbol_short!("def"), &token_b, &1_000, &token_b, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_a, &1_000, &token_a, &0, &symbol_short!(""), &0); + client.register_offering(&issuer, &symbol_short!("def"), &token_b, &1_000, &token_b, &0, &symbol_short!(""), &0); client .report_revenue(&issuer, &symbol_short!("def"), &token_a, &token_a, &100, &9, &false) @@ -565,7 +568,7 @@ fn frozen_contract_rejects_report_revenue() { let token = Address::generate(&env); client.initialize(&admin, &None::
, &None::); - client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.freeze(); let r = @@ -592,7 +595,8 @@ fn frozen_contract_rejects_deposit_revenue() { &1_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 1_000_000); client.freeze(); diff --git a/src/test_prove_distribution.rs b/src/test_prove_distribution.rs index 3ba07a64b..b142420c2 100644 --- a/src/test_prove_distribution.rs +++ b/src/test_prove_distribution.rs @@ -42,7 +42,8 @@ fn prove_distribution_normal_case() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); let holder_a = Address::generate(&env); let holder_b = Address::generate(&env); @@ -107,7 +108,8 @@ fn prove_distribution_digest_is_deterministic() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); let holder_a = Address::generate(&env); let holder_b = Address::generate(&env); @@ -163,7 +165,8 @@ fn prove_distribution_ordering_affects_digest() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); let holder_a = Address::generate(&env); let holder_b = Address::generate(&env); @@ -223,7 +226,8 @@ fn prove_distribution_empty_holders() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 10_000_000); client.deposit_revenue( @@ -266,7 +270,8 @@ fn prove_distribution_unknown_period_id_returns_zero_payouts() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); let holder_a = Address::generate(&env); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder_a, &3_000u32); @@ -316,7 +321,8 @@ fn prove_distribution_zero_share_bps_yields_zero_payout() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 10_000_000); client.deposit_revenue( @@ -365,7 +371,8 @@ fn prove_distribution_usdc_6_decimals_normalizes_correctly() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); // Configure 6-decimal payment token (USDC-style) client.set_payment_token_decimals(&issuer, &symbol_short!("def"), &token, &6u32); @@ -420,7 +427,8 @@ fn prove_distribution_respects_round_half_up_mode() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); client.set_rounding_mode(&issuer, &symbol_short!("def"), &token, &RoundingMode::RoundHalfUp); let holder = Address::generate(&env); @@ -463,7 +471,8 @@ fn prove_distribution_caps_at_max_chunk_periods() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 1_000_000); client.deposit_revenue( @@ -510,7 +519,8 @@ fn prove_distribution_entry_fields_match() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); let holder = Address::generate(&env); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &10_000u32); @@ -560,7 +570,8 @@ fn prove_distribution_different_periods_produce_different_digests() { &1_000u32, &payment_token, &0i128, - ); + &symbol_short!(""), + &0); let holder = Address::generate(&env); client.set_holder_share(&issuer, &symbol_short!("def"), &token, &holder, &5_000u32); diff --git a/src/test_reconciliation_bug.rs b/src/test_reconciliation_bug.rs index b7ed4b60e..bff71de19 100644 --- a/src/test_reconciliation_bug.rs +++ b/src/test_reconciliation_bug.rs @@ -48,7 +48,7 @@ fn setup_offering_with_payment_token( let (payment_token, _pt_admin) = create_payment_token(&env); // Register offering (5000 bps = 50% revenue share) - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payment_token, &0, &symbol_short!(""), &0); // Mint payment tokens to the issuer so they can deposit mint_tokens(&env, &payment_token, &issuer, 10_000_000); diff --git a/src/test_snapshot_finalization.rs b/src/test_snapshot_finalization.rs index ba8b3888d..c129ab468 100644 --- a/src/test_snapshot_finalization.rs +++ b/src/test_snapshot_finalization.rs @@ -18,7 +18,7 @@ fn setup_snapshot_test( let token = Address::generate(&env); let payout_asset = Address::generate(&env); - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); (env, client, issuer, token, payout_asset, contract_id) } diff --git a/src/test_snapshot_monotonicity_replay.rs b/src/test_snapshot_monotonicity_replay.rs index 5957f8d1a..a0638e03b 100644 --- a/src/test_snapshot_monotonicity_replay.rs +++ b/src/test_snapshot_monotonicity_replay.rs @@ -77,7 +77,8 @@ fn setup() -> (Env, RevoraRevenueShareClient<'static>, Address, Address) { &5_000, &payout_asset, &0, - ); + &symbol_short!(""), + &0); // Enable snapshot distribution for this offering. client.set_snapshot_config(&issuer, &symbol_short!("def"), &token, &true); @@ -343,7 +344,7 @@ fn snapshot_replay_is_isolated_per_offering() { // Register a second offering (different token, same issuer/namespace). let token_b = Address::generate(&env); let payout_b = Address::generate(&env); - client.register_offering(&issuer, &ns, &token_b, &5_000, &payout_b, &0); + client.register_offering(&issuer, &ns, &token_b, &5_000, &payout_b, &0, &symbol_short!(""), &0); client.set_snapshot_config(&issuer, &ns, &token_b, &true); // Advance offering A to ref 100. diff --git a/src/test_snapshot_negative_matrix.rs b/src/test_snapshot_negative_matrix.rs index 4e85d146f..d36f87c21 100644 --- a/src/test_snapshot_negative_matrix.rs +++ b/src/test_snapshot_negative_matrix.rs @@ -72,7 +72,7 @@ fn setup_snapshot_test() -> (Env, RevoraRevenueShareClient<'static>, Address, Ad let payout_asset = Address::generate(&env); // Register offering with payout_asset - client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0); + client.register_offering(&issuer, &symbol_short!("def"), &token, &5_000, &payout_asset, &0, &symbol_short!(""), &0); (env, client, issuer, token, payout_asset, contract_id) } diff --git a/src/test_time_windows.rs b/src/test_time_windows.rs index 369a95c63..c55176392 100644 --- a/src/test_time_windows.rs +++ b/src/test_time_windows.rs @@ -134,7 +134,8 @@ fn setup_with_holder() -> ( &10_000, // 100% share pool &payment_token, &0, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 10_000_000); RevoraRevenueShareClient::new(&env, &cid).set_holder_share(&issuer, &symbol_short!("ns"), &offering_token, &holder, &10_000); @@ -193,7 +194,7 @@ fn report_window_unset_always_open() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // Verify no window is stored assert!(client.get_report_window(&issuer, &symbol_short!("ns"), &token).is_none()); @@ -222,7 +223,7 @@ fn report_window_before_start_is_closed() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // Window: [1000, 2000] client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -244,7 +245,7 @@ fn report_window_at_start_is_open_inclusive() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -264,7 +265,7 @@ fn report_window_inside_is_open() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -284,7 +285,7 @@ fn report_window_at_end_is_open_inclusive() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -304,7 +305,7 @@ fn report_window_after_end_is_closed() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -324,7 +325,7 @@ fn report_window_zero_width_open_at_exact_timestamp() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // start == end: single-second window at T=5000 client.set_report_window(&issuer, &symbol_short!("ns"), &token, &5_000, &5_000); @@ -345,7 +346,7 @@ fn report_window_zero_width_closed_before() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &5_000, &5_000); @@ -365,7 +366,7 @@ fn report_window_zero_width_closed_after() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &5_000, &5_000); @@ -385,7 +386,7 @@ fn report_window_reconfigured_to_exclude_now_closes_reporting() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // Initial window: [1000, 3000]; now = 2000 → open client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &3_000); @@ -411,7 +412,7 @@ fn report_window_reconfigured_to_include_now_opens_reporting() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); // Initial window: [4000, 5000]; now = 2000 → closed client.set_report_window(&issuer, &symbol_short!("ns"), &token, &4_000, &5_000); @@ -617,7 +618,7 @@ fn set_report_window_valid_range_accepted() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); assert!(r.is_ok()); @@ -636,7 +637,7 @@ fn set_report_window_zero_width_accepted() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_set_report_window(&issuer, &symbol_short!("ns"), &token, &5_000, &5_000); assert!(r.is_ok(), "zero-width window must be accepted, got {r:?}"); @@ -651,7 +652,7 @@ fn set_report_window_inverted_range_rejected() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_set_report_window(&issuer, &symbol_short!("ns"), &token, &2_000, &1_000); assert_eq!(r, Err(Ok(RevoraError::LimitReached))); @@ -669,7 +670,7 @@ fn set_claim_window_valid_range_accepted() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_set_claim_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); assert!(r.is_ok()); @@ -688,7 +689,7 @@ fn set_claim_window_zero_width_accepted() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_set_claim_window(&issuer, &symbol_short!("ns"), &token, &5_000, &5_000); assert!(r.is_ok(), "zero-width window must be accepted, got {r:?}"); @@ -703,7 +704,7 @@ fn set_claim_window_inverted_range_rejected() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let r = client.try_set_claim_window(&issuer, &symbol_short!("ns"), &token, &2_000, &1_000); assert_eq!(r, Err(Ok(RevoraError::LimitReached))); @@ -945,8 +946,8 @@ fn report_window_is_scoped_per_offering() { let token_a = Address::generate(&env); let token_b = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token_a, &1_000, &token_a, &0); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token_b, &1_000, &token_b, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token_a, &1_000, &token_a, &0, &symbol_short!(""), &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token_b, &1_000, &token_b, &0, &symbol_short!(""), &0); // Close offering A's report window; leave B's unset (always open) client.set_report_window(&issuer, &symbol_short!("ns"), &token_a, &5_000, &6_000); @@ -981,10 +982,12 @@ fn claim_window_is_scoped_per_offering() { RevoraRevenueShareClient::new(&env, &cid).register_offering( &issuer, &symbol_short!("ns"), &token_a, &10_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); RevoraRevenueShareClient::new(&env, &cid).register_offering( &issuer, &symbol_short!("ns"), &token_b, &10_000, &payment_token, &0, - ); + &symbol_short!(""), + &0); mint(&env, &payment_token, &issuer, 10_000_000); RevoraRevenueShareClient::new(&env, &cid).set_holder_share(&issuer, &symbol_short!("ns"), &token_a, &holder, &10_000); RevoraRevenueShareClient::new(&env, &cid).set_holder_share(&issuer, &symbol_short!("ns"), &token_b, &holder, &10_000); @@ -1022,7 +1025,7 @@ fn set_report_window_emits_event() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let before = env.events().all().len(); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -1041,7 +1044,7 @@ fn set_claim_window_emits_event() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); let before = env.events().all().len(); client.set_claim_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); @@ -1064,7 +1067,7 @@ fn get_report_window_returns_none_when_unset() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); assert!(client.get_report_window(&issuer, &symbol_short!("ns"), &token).is_none()); } @@ -1078,7 +1081,7 @@ fn get_claim_window_returns_none_when_unset() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); assert!(client.get_claim_window(&issuer, &symbol_short!("ns"), &token).is_none()); } @@ -1092,7 +1095,7 @@ fn get_report_window_returns_correct_values() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_234, &5_678); let w = client.get_report_window(&issuer, &symbol_short!("ns"), &token).unwrap(); @@ -1109,7 +1112,7 @@ fn get_claim_window_returns_correct_values() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_claim_window(&issuer, &symbol_short!("ns"), &token, &9_000, &9_999); let w = client.get_claim_window(&issuer, &symbol_short!("ns"), &token).unwrap(); @@ -1126,7 +1129,7 @@ fn set_report_window_overwrites_previous() { let client = RevoraRevenueShareClient::new(&env, &cid); let issuer = Address::generate(&env); let token = Address::generate(&env); - RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0); + RevoraRevenueShareClient::new(&env, &cid).register_offering(&issuer, &symbol_short!("ns"), &token, &1_000, &token, &0, &symbol_short!(""), &0); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &1_000, &2_000); client.set_report_window(&issuer, &symbol_short!("ns"), &token, &3_000, &4_000);