From 8da808d581d925f0a7d8249a42507daaa5195c68 Mon Sep 17 00:00:00 2001 From: loothero Date: Wed, 12 Nov 2025 07:58:09 -0800 Subject: [PATCH 1/7] dedicated premint endpoint --- src/contract.cairo | 41 ++-- src/interfaces.cairo | 3 + tests/helper.cairo | 8 - tests/test_contract.cairo | 476 ++++++++++++++++++++------------------ 4 files changed, 271 insertions(+), 257 deletions(-) diff --git a/src/contract.cairo b/src/contract.cairo index 1c53a80..daca47f 100644 --- a/src/contract.cairo +++ b/src/contract.cairo @@ -106,8 +106,6 @@ pub mod TicketMaster { /// @param issuance_reduction_bips The issuance reduction expressed in basis points (out of /// 10,000) /// @param treasury_address The address of the treasury - /// @param recipients The addresses of the recipients of the tokens - /// @param amounts The amounts of tokens to mint to the recipients /// @param distribution_end_time The end time of the token distribution /// @param buyback_order_config The configuration for the buyback orders #[constructor] @@ -131,8 +129,6 @@ pub mod TicketMaster { issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, treasury_address: ContractAddress, - recipients: Array, - amounts: Array, distribution_end_time: u64, buyback_order_config: BuybackOrderConfig, ) { @@ -150,11 +146,6 @@ pub mod TicketMaster { assert(treasury_address != zero_address, 'Invalid treasury address'); assert(total_supply > 0, 'Invalid total supply'); - // Validate recipients and amounts arrays - let recipients_len = recipients.len(); - let amounts_len = amounts.len(); - assert(recipients_len == amounts_len, 'Arrays length mismatch'); - let current_time = starknet::get_block_timestamp(); assert!(distribution_end_time > current_time, "End time must be greater than now"); @@ -191,22 +182,33 @@ pub mod TicketMaster { self.distribution_end_time.write(distribution_end_time); self.buyback_order_config.write(buyback_order_config); - // Distribute tokens to initial recipients - let total_distributed = _distribute_initial_tokens( - ref self, recipients, amounts, total_supply, zero_address, - ); - - let remaining_supply = total_supply.into() - total_distributed; - // register token with Ekubo registry _register_token(ref self); // Store tokens remaining for distribution - self.tokens_for_distribution.write(remaining_supply - ERC20_UNIT.into()); + self.tokens_for_distribution.write(total_supply.into()); } #[abi(embed_v0)] impl TicketMasterImpl of ITicketMaster { + fn premint_tokens( + ref self: ContractState, recipients: Array, amounts: Array, + ) { + self.ownable.assert_only_owner(); + assert(self.deployment_state.read() == 0, 'Deployment state is not 0'); + + let token_available = self.tokens_for_distribution.read(); + + // Distribute tokens to initial recipients + let total_distributed = _distribute_initial_tokens( + ref self, recipients, amounts, token_available.try_into().unwrap(), + ); + + let remaining_supply = token_available - total_distributed; + + self.tokens_for_distribution.write(remaining_supply); + } + /// @notice Initializes the TWAMM pools for the distribution and buyback tokens /// @dev This function should be called as step 1 after deployment /// @param distribution_initial_tick The initial tick for the distribution pool @@ -1226,14 +1228,12 @@ pub mod TicketMaster { /// @param recipients Array of recipient addresses /// @param amounts Array of token amounts to distribute /// @param total_supply Total supply of tokens - /// @param zero_address The zero address for validation /// @return Total amount of tokens distributed fn _distribute_initial_tokens( ref self: ContractState, recipients: Array, amounts: Array, total_supply: u128, - zero_address: ContractAddress, ) -> u256 { let recipients_len = recipients.len(); let mut total_distributed: u256 = 0; @@ -1244,9 +1244,6 @@ pub mod TicketMaster { let recipient = *recipients.at(i); let amount = *amounts.at(i); - // Ensure recipient is not zero address - assert(recipient != zero_address, 'Invalid recipient address'); - // Mint tokens directly to recipient self.erc20.mint(recipient, amount); diff --git a/src/interfaces.cairo b/src/interfaces.cairo index 5e2745c..c05bef6 100644 --- a/src/interfaces.cairo +++ b/src/interfaces.cairo @@ -10,6 +10,9 @@ use starknet::ContractAddress; #[starknet::interface] pub trait ITicketMaster { fn init_distribution_pool(ref self: TContractState, distribution_initial_tick: i129) -> u256; + fn premint_tokens( + ref self: TContractState, recipients: Array, amounts: Array, + ); fn provide_initial_liquidity( ref self: TContractState, payment_token_amount: u128, diff --git a/tests/helper.cairo b/tests/helper.cairo index 39de100..4fd8192 100644 --- a/tests/helper.cairo +++ b/tests/helper.cairo @@ -130,8 +130,6 @@ pub fn ticket_master_calldata_custom( issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, treasury_address: ContractAddress, - recipients: Array, - amounts: Array, distribution_end_time: u64, buyback_order_config: BuybackOrderConfig, ) -> Array { @@ -155,8 +153,6 @@ pub fn ticket_master_calldata_custom( issuance_reduction_price_duration.serialize(ref calldata); issuance_reduction_bips.serialize(ref calldata); treasury_address.serialize(ref calldata); - recipients.serialize(ref calldata); - amounts.serialize(ref calldata); distribution_end_time.serialize(ref calldata); buyback_order_config.serialize(ref calldata); @@ -183,8 +179,6 @@ pub fn ticket_master_calldata( let symbol: ByteArray = "BDT"; let total_supply: u128 = DUNGEON_TICKET_SUPPLY; let distribution_pool_fee: u128 = DISTRIBUTION_POOL_FEE_BPS; - let recipients: Array = array![]; - let amounts: Array = array![]; let distribution_end_time: u64 = DISTRIBUTION_END_TIME; let buyback_order_config = BUYBACK_ORDER_CONFIG; @@ -207,8 +201,6 @@ pub fn ticket_master_calldata( issuance_reduction_price_duration, issuance_reduction_bips, treasury_address, - recipients, - amounts, distribution_end_time, buyback_order_config, ) diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index 8978a43..3c09747 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -50,15 +50,6 @@ fn constructor_sets_initial_state() { let ticket_master_class = declare_class("TicketMaster"); - let alice: ContractAddress = 'alice'.try_into().unwrap(); - let bob: ContractAddress = 'bob'.try_into().unwrap(); - - let amount_alice: u128 = 1_000_000_000_000_000_000; - let amount_bob: u128 = 2_000_000_000_000_000_000; - - let recipients = array![alice, bob]; - let amounts = array![amount_alice.into(), amount_bob.into()]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -78,8 +69,6 @@ fn constructor_sets_initial_state() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -90,6 +79,15 @@ fn constructor_sets_initial_state() { }; let ticket_token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; + // Call premint_tokens after deployment + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + let recipient: ContractAddress = 'recipient'.try_into().unwrap(); + let recipients: Array = array![recipient]; + let premint_amount: u256 = 1000000_u256; + let amounts: Array = array![premint_amount]; + ticket_master_dispatcher.premint_tokens(recipients, amounts); + stop_cheat_caller_address(ticket_master_dispatcher.contract_address); + assert!( ticket_master_dispatcher.get_payment_token() == payment_token_address, "payment token mismatch", @@ -152,74 +150,156 @@ fn constructor_sets_initial_state() { assert!(ticket_master_dispatcher.get_buyback_rate() == 0, "buyback rate should start at 0"); let registry_token_amount: u256 = 1000000000000000000_u128.into(); - let distributed_to_recipients: u256 = amount_alice.into() + amount_bob.into(); - let expected_minted_supply = distributed_to_recipients + registry_token_amount; - assert!( - ticket_token_dispatcher.total_supply() == expected_minted_supply, - "unexpected total supply after constructor", - ); - assert!( - ticket_token_dispatcher.balance_of(alice) == amount_alice.into(), - "alice should receive requested amount", - ); - assert!( - ticket_token_dispatcher.balance_of(bob) == amount_bob.into(), - "bob should receive requested amount", - ); assert!( ticket_token_dispatcher.balance_of(MOCK_REGISTRY_ADDRESS) == registry_token_amount, "registry should receive single token", ); - let total_supply_u256: u256 = DUNGEON_TICKET_SUPPLY.into(); - let expected_tokens_for_distribution = total_supply_u256 - expected_minted_supply; + let expected_tokens_for_distribution = DUNGEON_TICKET_SUPPLY.into() - premint_amount; assert!( ticket_master_dispatcher.get_tokens_for_distribution() == expected_tokens_for_distribution, - "tokens_for_distribution mismatch", + "tokens_for_distribution mismatch. Expected: {}, Actual: {}", + expected_tokens_for_distribution, + ticket_master_dispatcher.get_tokens_for_distribution(), ); } #[test] -#[fuzzer] -fn test_distribute_initial_tokens_multiple_recipients(delta_a: u64, delta_b: u64, delta_c: u64) { +fn premint_tokens_distributes_correctly() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); let erc20_class = declare_class("ERC20Mock"); - let payment_token_address = deploy( erc20_class, token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), ); + let reward_token_address = deploy( + erc20_class, + token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), + ); + let ticket_master_class = declare_class("TicketMaster"); + let calldata = ticket_master_calldata_custom( + DEPLOYER_ADDRESS, + "Beasts Dungeon Ticket", + "BDT", + DUNGEON_TICKET_SUPPLY, + DISTRIBUTION_POOL_FEE_BPS, + payment_token_address, + reward_token_address, + MOCK_CORE_ADDRESS, + MOCK_POSITIONS_ADDRESS, + MOCK_POSITION_NFT_ADDRESS, + MOCK_TWAMM_EXTENSION_ADDRESS, + MOCK_REGISTRY_ADDRESS, + EKUBO_ORACLE_MAINNET, + MOCK_VELORDS_ADDRESS, + ISSUANCE_REDUCTION_PRICE_X128, + ISSUANCE_REDUCTION_PRICE_DURATION, + ISSUANCE_REDUCTION_BIPS, + MOCK_TREASURY, + DISTRIBUTION_END_TIME, + BUYBACK_ORDER_CONFIG, + ); + + let ticket_master_address = deploy(ticket_master_class, calldata); + let ticket_master_dispatcher = ITicketMasterDispatcher { + contract_address: ticket_master_address, + }; + let ticket_token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; + + let alice: ContractAddress = 'alice_premint'.try_into().unwrap(); + let bob: ContractAddress = 'bob_premint'.try_into().unwrap(); + let amount_alice: u128 = 1_000_000_000_000_000_000; + let amount_bob: u128 = 2_000_000_000_000_000_000; + + let recipients = array![alice, bob]; + let amounts = array![amount_alice.into(), amount_bob.into()]; + + let tokens_before = ticket_master_dispatcher.get_tokens_for_distribution(); + + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + ticket_master_dispatcher.premint_tokens(recipients, amounts); + stop_cheat_caller_address(ticket_master_dispatcher.contract_address); + + assert_eq!(ticket_token_dispatcher.balance_of(alice), amount_alice.into()); + assert_eq!(ticket_token_dispatcher.balance_of(bob), amount_bob.into()); + + let tokens_after = ticket_master_dispatcher.get_tokens_for_distribution(); + let expected_remaining = tokens_before - amount_alice.into() - amount_bob.into(); + assert_eq!(tokens_after, expected_remaining); +} + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn premint_tokens_rejects_non_owner() { + start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); + + let erc20_class = declare_class("ERC20Mock"); + let payment_token_address = deploy( + erc20_class, + token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), + ); let reward_token_address = deploy( erc20_class, token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), ); let ticket_master_class = declare_class("TicketMaster"); + let calldata = ticket_master_calldata_custom( + DEPLOYER_ADDRESS, + "Beasts Dungeon Ticket", + "BDT", + DUNGEON_TICKET_SUPPLY, + DISTRIBUTION_POOL_FEE_BPS, + payment_token_address, + reward_token_address, + MOCK_CORE_ADDRESS, + MOCK_POSITIONS_ADDRESS, + MOCK_POSITION_NFT_ADDRESS, + MOCK_TWAMM_EXTENSION_ADDRESS, + MOCK_REGISTRY_ADDRESS, + EKUBO_ORACLE_MAINNET, + MOCK_VELORDS_ADDRESS, + ISSUANCE_REDUCTION_PRICE_X128, + ISSUANCE_REDUCTION_PRICE_DURATION, + ISSUANCE_REDUCTION_BIPS, + MOCK_TREASURY, + DISTRIBUTION_END_TIME, + BUYBACK_ORDER_CONFIG, + ); - let alice: ContractAddress = 'alice_multi'.try_into().unwrap(); - let bob: ContractAddress = 'bob_multi'.try_into().unwrap(); - let carol: ContractAddress = 'carol_multi'.try_into().unwrap(); + let ticket_master_address = deploy(ticket_master_class, calldata); + let ticket_master_dispatcher = ITicketMasterDispatcher { + contract_address: ticket_master_address, + }; - let registry_token_amount: u128 = 1_000_000_000_000_000_000; - let base_alice: u128 = 1_000_000_000_000_000_000; - let base_bob: u128 = 2_000_000_000_000_000_000; - let base_carol: u128 = 3_000_000_000_000_000_000; + let alice: ContractAddress = 'alice'.try_into().unwrap(); + let recipients = array![alice]; + let amounts = array![1_000_u128.into()]; - let perturbation_bound: u128 = 1_000; - let amount_alice: u128 = base_alice + ((delta_a.into()) % perturbation_bound); - let amount_bob: u128 = base_bob + ((delta_b.into()) % perturbation_bound); - let amount_carol: u128 = base_carol + ((delta_c.into()) % perturbation_bound); + let non_owner: ContractAddress = 'non_owner'.try_into().unwrap(); + start_cheat_caller_address(ticket_master_dispatcher.contract_address, non_owner); + ticket_master_dispatcher.premint_tokens(recipients, amounts); +} - let recipients = array![alice, bob, carol]; - let amounts = array![amount_alice.into(), amount_bob.into(), amount_carol.into()]; +#[test] +#[should_panic(expected: ('Deployment state is not 0',))] +fn premint_tokens_rejects_after_state_transition() { + start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); + mock_ekubo_core(1_u256); - let total_recipient_mints: u128 = amount_alice + amount_bob + amount_carol; - if total_recipient_mints + registry_token_amount >= DUNGEON_TICKET_SUPPLY { - return; - } + let erc20_class = declare_class("ERC20Mock"); + let payment_token_address = deploy( + erc20_class, + token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), + ); + let reward_token_address = deploy( + erc20_class, + token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), + ); + let ticket_master_class = declare_class("TicketMaster"); let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -239,32 +319,90 @@ fn test_distribute_initial_tokens_multiple_recipients(delta_a: u64, delta_b: u64 ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); - let ticket_master_address = match ticket_master_class.deploy(@calldata) { - Result::Ok((address, _)) => address, - Result::Err(_) => { return; }, + let ticket_master_address = deploy(ticket_master_class, calldata); + let ticket_master_dispatcher = ITicketMasterDispatcher { + contract_address: ticket_master_address, }; + + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + + // Transition to state 1 + ticket_master_dispatcher.init_distribution_pool(DISTRIBUTION_INITIAL_TICK); + + // Try to premint after state transition + let alice: ContractAddress = 'alice'.try_into().unwrap(); + let recipients = array![alice]; + let amounts = array![1_000_u128.into()]; + + ticket_master_dispatcher.premint_tokens(recipients, amounts); +} + +#[test] +fn premint_tokens_can_be_called_multiple_times_in_state_0() { + start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); + + let erc20_class = declare_class("ERC20Mock"); + let payment_token_address = deploy( + erc20_class, + token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), + ); + let reward_token_address = deploy( + erc20_class, + token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), + ); + + let ticket_master_class = declare_class("TicketMaster"); + let calldata = ticket_master_calldata_custom( + DEPLOYER_ADDRESS, + "Beasts Dungeon Ticket", + "BDT", + DUNGEON_TICKET_SUPPLY, + DISTRIBUTION_POOL_FEE_BPS, + payment_token_address, + reward_token_address, + MOCK_CORE_ADDRESS, + MOCK_POSITIONS_ADDRESS, + MOCK_POSITION_NFT_ADDRESS, + MOCK_TWAMM_EXTENSION_ADDRESS, + MOCK_REGISTRY_ADDRESS, + EKUBO_ORACLE_MAINNET, + MOCK_VELORDS_ADDRESS, + ISSUANCE_REDUCTION_PRICE_X128, + ISSUANCE_REDUCTION_PRICE_DURATION, + ISSUANCE_REDUCTION_BIPS, + MOCK_TREASURY, + DISTRIBUTION_END_TIME, + BUYBACK_ORDER_CONFIG, + ); + + let ticket_master_address = deploy(ticket_master_class, calldata); let ticket_master_dispatcher = ITicketMasterDispatcher { contract_address: ticket_master_address, }; let ticket_token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; - assert_eq!(ticket_token_dispatcher.balance_of(alice), amount_alice.into()); - assert_eq!(ticket_token_dispatcher.balance_of(bob), amount_bob.into()); - assert_eq!(ticket_token_dispatcher.balance_of(carol), amount_carol.into()); + let alice: ContractAddress = 'alice_multi'.try_into().unwrap(); + let bob: ContractAddress = 'bob_multi'.try_into().unwrap(); + + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + + // First premint + ticket_master_dispatcher.premint_tokens(array![alice], array![1_000_u128.into()]); + assert_eq!(ticket_token_dispatcher.balance_of(alice), 1_000_u128.into()); - let distributed_total: u256 = amount_alice.into() - + amount_bob.into() - + amount_carol.into() - + registry_token_amount.into(); - let expected_remaining = DUNGEON_TICKET_SUPPLY.into() - distributed_total; + // Second premint + ticket_master_dispatcher.premint_tokens(array![bob], array![2_000_u128.into()]); + assert_eq!(ticket_token_dispatcher.balance_of(bob), 2_000_u128.into()); - assert_eq!(ticket_master_dispatcher.get_tokens_for_distribution(), expected_remaining); + stop_cheat_caller_address(ticket_master_dispatcher.contract_address); + + // Both should have their balances + assert_eq!(ticket_token_dispatcher.balance_of(alice), 1_000_u128.into()); + assert_eq!(ticket_token_dispatcher.balance_of(bob), 2_000_u128.into()); } #[test] @@ -284,12 +422,9 @@ fn burn_reduces_balance_and_total_supply() { let ticket_master_class = declare_class("TicketMaster"); let burner: ContractAddress = 'burner'.try_into().unwrap(); - let minted_amount: u128 = 10_u128 * ERC20_UNIT; + let minted_amount: u256 = 10 * ERC20_UNIT.into(); let burn_amount: u128 = 4_u128 * ERC20_UNIT; - let recipients = array![burner]; - let amounts = array![minted_amount.into()]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -309,8 +444,6 @@ fn burn_reduces_balance_and_total_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -319,6 +452,11 @@ fn burn_reduces_balance_and_total_supply() { let ticket_master_dispatcher = ITicketMasterDispatcher { contract_address: ticket_master_address, }; + + // set caller to OWNER + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + ticket_master_dispatcher.premint_tokens(array![burner], array![minted_amount.into()]); + let ticket_token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; let initial_balance = ticket_token_dispatcher.balance_of(burner); @@ -356,12 +494,9 @@ fn burn_from_reduces_balance_and_total_supply() { let burner: ContractAddress = 'burner'.try_into().unwrap(); let spender: ContractAddress = 'spender'.try_into().unwrap(); - let minted_amount: u128 = 10_u128 * ERC20_UNIT; + let minted_amount: u256 = 10 * ERC20_UNIT.into(); let burn_amount: u128 = 4_u128 * ERC20_UNIT; - let recipients = array![burner]; - let amounts = array![minted_amount.into()]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -381,8 +516,6 @@ fn burn_from_reduces_balance_and_total_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -391,6 +524,10 @@ fn burn_from_reduces_balance_and_total_supply() { let ticket_master_dispatcher = ITicketMasterDispatcher { contract_address: ticket_master_address, }; + // set caller to OWNER + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + ticket_master_dispatcher.premint_tokens(array![burner], array![minted_amount.into()]); + let ticket_token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; let initial_balance = ticket_token_dispatcher.balance_of(burner); @@ -436,7 +573,7 @@ fn burn_from_rejects_without_allowance() { let burner: ContractAddress = 'burner'.try_into().unwrap(); let spender: ContractAddress = 'spender'.try_into().unwrap(); - let minted_amount: u128 = 10_u128 * ERC20_UNIT; + let minted_amount: u256 = 10 * ERC20_UNIT.into(); let burn_amount: u128 = 4_u128 * ERC20_UNIT; let recipients = array![burner]; @@ -461,8 +598,6 @@ fn burn_from_rejects_without_allowance() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -471,6 +606,10 @@ fn burn_from_rejects_without_allowance() { let ticket_master_dispatcher = ITicketMasterDispatcher { contract_address: ticket_master_address, }; + // set caller to OWNER + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + ticket_master_dispatcher.premint_tokens(recipients, amounts); + let ticket_token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; assert_eq!(ticket_token_dispatcher.balance_of(burner), minted_amount.into()); @@ -499,56 +638,6 @@ fn fuzz_constructor_valid_configs( token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), ); - let recipient_count = (recipient_seed % 4) + 1; - let max_distributable: u128 = DUNGEON_TICKET_SUPPLY - 1_000_000_000_000_000_000; - let mut recipients: Array = array![]; - let mut amounts: Array = array![]; - let mut remaining: u128 = max_distributable; - let mut distributed: u128 = 0; - let amount_seed: u128 = amount_seed_low.into(); - - let offset = recipient_seed % 4; - - let mut index: u64 = 0; - loop { - if index == recipient_count { - break; - } - - let candidate_index = (offset + index) % 4; - let recipient = match candidate_index { - 0 => 'seed0'.try_into().unwrap(), - 1 => 'seed1'.try_into().unwrap(), - 2 => 'seed2'.try_into().unwrap(), - _ => 'seed3'.try_into().unwrap(), - }; - recipients.append(recipient); - - let recipients_left = recipient_count - index; - let recipients_left_u128: u128 = recipients_left.into(); - let max_for_this = if recipients_left_u128 == 0 { - 0 - } else { - remaining / recipients_left_u128 + 1 - }; - let index_u128: u128 = index.into(); - let raw = amount_seed + index_u128 * 7919_u128; - let chosen = if max_for_this == 0 { - 0 - } else { - raw % max_for_this - }; - amounts.append(chosen.into()); - distributed += chosen; - if chosen > remaining { - remaining = 0; - } else { - remaining -= chosen; - } - - index += 1; - } - let base_time = 1_000_u64; start_cheat_block_timestamp_global(base_time); @@ -578,8 +667,6 @@ fn fuzz_constructor_valid_configs( ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, end_time, BUYBACK_ORDER_CONFIG, ); @@ -595,26 +682,8 @@ fn fuzz_constructor_valid_configs( let ticket_master_dispatcher = ITicketMasterDispatcher { contract_address: ticket_master_address, }; - let token_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; assert_eq!(ticket_master_dispatcher.get_deployment_state(), 0_u8); - - let registry_token_amount: u128 = 1_000_000_000_000_000_000; - let expected_total_minted: u128 = distributed + registry_token_amount; - let expected_tokens_for_distribution: u128 = DUNGEON_TICKET_SUPPLY - expected_total_minted; - - if expected_tokens_for_distribution == 0 { - start_cheat_block_timestamp_global(0_u64); - return; - } - - let total_supply: u256 = token_dispatcher.total_supply(); - assert_eq!(total_supply, expected_total_minted.into()); - - let recorded_tokens_for_distribution = ticket_master_dispatcher.get_tokens_for_distribution(); - assert_eq!(recorded_tokens_for_distribution, expected_tokens_for_distribution.into()); - - start_cheat_block_timestamp_global(0_u64); } #[test] @@ -648,8 +717,6 @@ fn constructor_rejects_zero_payment_token() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -689,8 +756,6 @@ fn constructor_rejects_zero_reward_token() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -734,8 +799,6 @@ fn constructor_rejects_zero_core_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -779,8 +842,6 @@ fn constructor_rejects_zero_positions_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -824,8 +885,6 @@ fn constructor_rejects_zero_position_nft_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -869,8 +928,6 @@ fn constructor_rejects_zero_extension_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -912,8 +969,6 @@ fn constructor_rejects_zero_registry_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -957,8 +1012,6 @@ fn constructor_rejects_zero_oracle_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1002,8 +1055,6 @@ fn constructor_rejects_zero_velords_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1047,8 +1098,6 @@ fn constructor_rejects_zero_treasury_address() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, ZERO_ADDRESS, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1073,10 +1122,6 @@ fn constructor_rejects_mismatched_lengths() { let ticket_master_class = declare_class("TicketMaster"); - let recipient: ContractAddress = 'alice'.try_into().unwrap(); - let recipients = array![recipient]; - let empty_amounts: Array = array![]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -1096,8 +1141,6 @@ fn constructor_rejects_mismatched_lengths() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - empty_amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1143,8 +1186,6 @@ fn constructor_rejects_end_before_now() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], invalid_end_time, BUYBACK_ORDER_CONFIG, ); @@ -1202,8 +1243,6 @@ fn constructor_rejects_end_past_max_duration() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], invalid_end_time, BUYBACK_ORDER_CONFIG, ); @@ -1228,9 +1267,6 @@ fn constructor_rejects_zero_recipient() { let ticket_master_class = declare_class("TicketMaster"); - let recipients = array![ZERO_ADDRESS]; - let amounts = array![1_000_u128.into()]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -1250,8 +1286,6 @@ fn constructor_rejects_zero_recipient() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1276,11 +1310,6 @@ fn constructor_rejects_distribution_exceeding_supply() { let ticket_master_class = declare_class("TicketMaster"); - let recipient: ContractAddress = 'alice'.try_into().unwrap(); - let recipients = array![recipient]; - let excessive_amount: u256 = DUNGEON_TICKET_SUPPLY.into() + 1_u128.into(); - let amounts = array![excessive_amount]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -1300,8 +1329,6 @@ fn constructor_rejects_distribution_exceeding_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1345,8 +1372,6 @@ fn constructor_rejects_zero_total_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1390,8 +1415,6 @@ fn constructor_rejects_reduction_bips_at_limit() { ISSUANCE_REDUCTION_PRICE_DURATION, BIPS_BASIS, // issuance_reduction_bips at limit (should reject) MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1435,8 +1458,6 @@ fn constructor_accepts_reduction_bips_boundary() { ISSUANCE_REDUCTION_PRICE_DURATION, BIPS_BASIS - 1, // issuance_reduction_bips at boundary (should accept) MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1853,8 +1874,6 @@ fn test_provide_initial_liquidity_consumes_stored_config( ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -1931,8 +1950,6 @@ fn test_provide_initial_liquidity_updates_tokens_for_distribution() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![], - array![], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -5248,9 +5265,6 @@ fn burn_reduces_total_supply() { let ticket_master_class = declare_class("TicketMaster"); // Create a deployment with initial distribution to deployer so they have tokens to burn - let recipients: Array = array![DEPLOYER_ADDRESS]; - let amounts: Array = array![1000000_u256]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -5270,8 +5284,6 @@ fn burn_reduces_total_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -5283,6 +5295,10 @@ fn burn_reduces_total_supply() { let erc20_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; start_cheat_caller_address(ticket_master_address, DEPLOYER_ADDRESS); + let recipients: Array = array![DEPLOYER_ADDRESS]; + let amounts: Array = array![1000000_u256]; + ticket_master_dispatcher.premint_tokens(recipients, amounts); + stop_cheat_caller_address(ticket_master_address); let initial_supply = erc20_dispatcher.total_supply(); let burn_amount = 500000_u256; @@ -5339,10 +5355,6 @@ fn burn_from_reduces_target_balance() { let ticket_master_class = declare_class("TicketMaster"); - let recipient: ContractAddress = 'recipient'.try_into().unwrap(); - let recipients: Array = array![recipient]; - let amounts: Array = array![1000000_u256]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -5362,8 +5374,6 @@ fn burn_from_reduces_target_balance() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -5374,6 +5384,14 @@ fn burn_from_reduces_target_balance() { }; let erc20_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; + // change to OWNER + start_cheat_caller_address(ticket_master_address, DEPLOYER_ADDRESS); + let recipient: ContractAddress = 'recipient'.try_into().unwrap(); + let recipients: Array = array![recipient]; + let amounts: Array = array![1000000_u256]; + ticket_master_dispatcher.premint_tokens(recipients, amounts); + stop_cheat_caller_address(ticket_master_address); + // Recipient approves deployer to burn their tokens start_cheat_caller_address(ticket_master_address, recipient); let burn_amount = 300000_u256; @@ -5408,10 +5426,6 @@ fn burn_from_reverts_without_approval() { let ticket_master_class = declare_class("TicketMaster"); - let recipient: ContractAddress = 'recipient'.try_into().unwrap(); - let recipients: Array = array![recipient]; - let amounts: Array = array![1000000_u256]; - let calldata = ticket_master_calldata_custom( DEPLOYER_ADDRESS, "Beasts Dungeon Ticket", @@ -5431,8 +5445,6 @@ fn burn_from_reverts_without_approval() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - recipients, - amounts, DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -5442,6 +5454,14 @@ fn burn_from_reverts_without_approval() { contract_address: ticket_master_address, }; + // change to OWNER + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + let recipient: ContractAddress = 'recipient'.try_into().unwrap(); + let recipients: Array = array![recipient]; + let amounts: Array = array![1000000_u256]; + ticket_master_dispatcher.premint_tokens(recipients, amounts); + stop_cheat_caller_address(ticket_master_address); + // Deployer tries to burn tokens from recipient without approval start_cheat_caller_address(ticket_master_address, DEPLOYER_ADDRESS); ticket_master_dispatcher.burn_from(recipient, 100000_u256); @@ -5830,14 +5850,7 @@ fn distribution_start_succeeds_with_minimal_tokens_for_distribution() { ); let payment_token_dispatcher = IERC20Dispatcher { contract_address: payment_token_address }; - let registry_token: u128 = 1_000_000_000_000_000_000; - let recipient: ContractAddress = 'tiny_recipient'.try_into().unwrap(); let total_supply: u128 = DUNGEON_TICKET_SUPPLY; - let minimal_distribution = 10_000_000_000_000_000_u128; - let recipient_amount = total_supply - - registry_token - - INITIAL_LIQUIDITY_DUNGEON_TICKETS - - minimal_distribution; let calldata_minimal = ticket_master_calldata_custom( DEPLOYER_ADDRESS, @@ -5858,8 +5871,6 @@ fn distribution_start_succeeds_with_minimal_tokens_for_distribution() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - array![recipient], - array![recipient_amount.into()], DISTRIBUTION_END_TIME, BUYBACK_ORDER_CONFIG, ); @@ -5873,8 +5884,19 @@ fn distribution_start_succeeds_with_minimal_tokens_for_distribution() { contract_address: ticket_master_address, }; - let expected_tokens_before_liquidity = INITIAL_LIQUIDITY_DUNGEON_TICKETS.into() - + minimal_distribution.into(); + // change to OWNER + start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); + let registry_token: u128 = 1_000_000_000_000_000_000; + let recipient: ContractAddress = 'tiny_recipient'.try_into().unwrap(); + let minimal_distribution = 10_000_000_000_000_000_u128; + let recipient_amount = total_supply + - registry_token + - INITIAL_LIQUIDITY_DUNGEON_TICKETS + - minimal_distribution; + ticket_master_dispatcher.premint_tokens(array![recipient], array![recipient_amount.into()]); + stop_cheat_caller_address(ticket_master_dispatcher.contract_address); + + let expected_tokens_before_liquidity = INITIAL_LIQUIDITY_DUNGEON_TICKETS.into() - minimal_distribution.into(); assert_eq!( ticket_master_dispatcher.get_tokens_for_distribution(), expected_tokens_before_liquidity, ); From 455b2a0f8617dc2038d4f0d3f4b5b376ad559b9e Mon Sep 17 00:00:00 2001 From: loothero Date: Wed, 12 Nov 2025 08:13:55 -0800 Subject: [PATCH 2/7] squash --- src/contract.cairo | 5 ++ tests/test_contract.cairo | 153 +++++++++++--------------------------- 2 files changed, 49 insertions(+), 109 deletions(-) diff --git a/src/contract.cairo b/src/contract.cairo index daca47f..2b312a7 100644 --- a/src/contract.cairo +++ b/src/contract.cairo @@ -196,6 +196,7 @@ pub mod TicketMaster { ) { self.ownable.assert_only_owner(); assert(self.deployment_state.read() == 0, 'Deployment state is not 0'); + assert(recipients.len() == amounts.len(), 'Arrays length mismatch'); let token_available = self.tokens_for_distribution.read(); @@ -1239,11 +1240,15 @@ pub mod TicketMaster { let mut total_distributed: u256 = 0; if recipients_len > 0 { + let zero_address: ContractAddress = 0.try_into().unwrap(); let mut i = 0; while i < recipients_len { let recipient = *recipients.at(i); let amount = *amounts.at(i); + // Validate recipient is not zero address + assert(recipient != zero_address, 'Invalid recipient address'); + // Mint tokens directly to recipient self.erc20.mint(recipient, amount); diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index 3c09747..72dda89 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -1107,29 +1107,11 @@ fn constructor_rejects_zero_treasury_address() { } #[test] +#[should_panic(expected: 'Arrays length mismatch')] fn constructor_rejects_mismatched_lengths() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - let erc20_class = declare_class("ERC20Mock"); - let payment_token_address = deploy( - erc20_class, - token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - let reward_token_address = deploy( - erc20_class, - token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - - let ticket_master_class = declare_class("TicketMaster"); - - let calldata = ticket_master_calldata_custom( - DEPLOYER_ADDRESS, - "Beasts Dungeon Ticket", - "BDT", - DUNGEON_TICKET_SUPPLY, - DISTRIBUTION_POOL_FEE_BPS, - payment_token_address, - reward_token_address, + let (ticket_master_dispatcher, _, _) = setup( MOCK_CORE_ADDRESS, MOCK_POSITIONS_ADDRESS, MOCK_POSITION_NFT_ADDRESS, @@ -1141,12 +1123,15 @@ fn constructor_rejects_mismatched_lengths() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - DISTRIBUTION_END_TIME, - BUYBACK_ORDER_CONFIG, ); - let deploy_result = ticket_master_class.deploy(@calldata); - assert_constructor_revert_with_message(deploy_result, 'Arrays length mismatch'); + // Try to call premint_tokens with mismatched array lengths + let recipient1: ContractAddress = 'recipient1'.try_into().unwrap(); + let recipient2: ContractAddress = 'recipient2'.try_into().unwrap(); + let recipients: Array = array![recipient1, recipient2]; + let amounts: Array = array![1000_u256]; // Only 1 amount for 2 recipients + + ticket_master_dispatcher.premint_tokens(recipients, amounts); } #[test] @@ -1252,29 +1237,11 @@ fn constructor_rejects_end_past_max_duration() { } #[test] +#[should_panic(expected: 'Invalid recipient address')] fn constructor_rejects_zero_recipient() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - let erc20_class = declare_class("ERC20Mock"); - let payment_token_address = deploy( - erc20_class, - token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - let reward_token_address = deploy( - erc20_class, - token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - - let ticket_master_class = declare_class("TicketMaster"); - - let calldata = ticket_master_calldata_custom( - DEPLOYER_ADDRESS, - "Beasts Dungeon Ticket", - "BDT", - DUNGEON_TICKET_SUPPLY, - DISTRIBUTION_POOL_FEE_BPS, - payment_token_address, - reward_token_address, + let (ticket_master_dispatcher, _, _) = setup( MOCK_CORE_ADDRESS, MOCK_POSITIONS_ADDRESS, MOCK_POSITION_NFT_ADDRESS, @@ -1286,38 +1253,22 @@ fn constructor_rejects_zero_recipient() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - DISTRIBUTION_END_TIME, - BUYBACK_ORDER_CONFIG, ); - let deploy_result = ticket_master_class.deploy(@calldata); - assert_constructor_revert_with_message(deploy_result, 'Invalid recipient address'); + // Try to call premint_tokens with zero address as recipient + let zero_address: ContractAddress = ZERO_ADDRESS; + let recipients: Array = array![zero_address]; + let amounts: Array = array![1000_u256]; + + ticket_master_dispatcher.premint_tokens(recipients, amounts); } #[test] +#[should_panic(expected: 'Distribution exceeds supply')] fn constructor_rejects_distribution_exceeding_supply() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - let erc20_class = declare_class("ERC20Mock"); - let payment_token_address = deploy( - erc20_class, - token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - let reward_token_address = deploy( - erc20_class, - token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - - let ticket_master_class = declare_class("TicketMaster"); - - let calldata = ticket_master_calldata_custom( - DEPLOYER_ADDRESS, - "Beasts Dungeon Ticket", - "BDT", - DUNGEON_TICKET_SUPPLY, - DISTRIBUTION_POOL_FEE_BPS, - payment_token_address, - reward_token_address, + let (ticket_master_dispatcher, _, _) = setup( MOCK_CORE_ADDRESS, MOCK_POSITIONS_ADDRESS, MOCK_POSITION_NFT_ADDRESS, @@ -1329,12 +1280,15 @@ fn constructor_rejects_distribution_exceeding_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - DISTRIBUTION_END_TIME, - BUYBACK_ORDER_CONFIG, ); - let deploy_result = ticket_master_class.deploy(@calldata); - assert_constructor_revert_with_message(deploy_result, 'Distribution exceeds supply'); + // Try to call premint_tokens with amount exceeding total supply + let recipient: ContractAddress = 'recipient'.try_into().unwrap(); + let recipients: Array = array![recipient]; + let excessive_amount: u256 = (DUNGEON_TICKET_SUPPLY + 1).into(); // More than total supply + let amounts: Array = array![excessive_amount]; + + ticket_master_dispatcher.premint_tokens(recipients, amounts); } #[test] @@ -1496,8 +1450,16 @@ fn provide_initial_liquidity_rejects_insufficient_remaining_supply() { MOCK_TREASURY, ); + // Premint some tokens to reduce available supply + let recipient: ContractAddress = 'recipient'.try_into().unwrap(); + let recipients: Array = array![recipient]; + let premint_amount: u256 = 1000_u256; // Premint 1000 tokens + let amounts: Array = array![premint_amount]; + ticket_master_dispatcher.premint_tokens(recipients, amounts); + let _ = ticket_master_dispatcher.init_distribution_pool(DISTRIBUTION_INITIAL_TICK); + // Try to use full supply for liquidity, which should fail since we preminted some ticket_master_dispatcher .provide_initial_liquidity( INITIAL_LIQUIDITY_PAYMENT_TOKEN, DUNGEON_TICKET_SUPPLY, INITIAL_LIQUIDITY_MIN_LIQUIDITY, @@ -5239,8 +5201,8 @@ fn get_tokens_for_distribution_returns_initial_value() { ); let tokens = ticket_master_dispatcher.get_tokens_for_distribution(); - // Should be total supply minus 1 ERC20_UNIT (for registry) - let expected = DUNGEON_TICKET_SUPPLY.into() - ERC20_UNIT.into(); + // Should be total supply (registry token not deducted from tokens_for_distribution) + let expected = DUNGEON_TICKET_SUPPLY.into(); assert_eq!(tokens, expected, "Tokens for distribution should match"); } @@ -5252,27 +5214,7 @@ fn get_tokens_for_distribution_returns_initial_value() { fn burn_reduces_total_supply() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - let erc20_class = declare_class("ERC20Mock"); - let payment_token_address = deploy( - erc20_class, - token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - let reward_token_address = deploy( - erc20_class, - token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - - let ticket_master_class = declare_class("TicketMaster"); - - // Create a deployment with initial distribution to deployer so they have tokens to burn - let calldata = ticket_master_calldata_custom( - DEPLOYER_ADDRESS, - "Beasts Dungeon Ticket", - "BDT", - DUNGEON_TICKET_SUPPLY, - DISTRIBUTION_POOL_FEE_BPS, - payment_token_address, - reward_token_address, + let (ticket_master_dispatcher, _, _) = setup( MOCK_CORE_ADDRESS, MOCK_POSITIONS_ADDRESS, MOCK_POSITION_NFT_ADDRESS, @@ -5284,21 +5226,16 @@ fn burn_reduces_total_supply() { ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, MOCK_TREASURY, - DISTRIBUTION_END_TIME, - BUYBACK_ORDER_CONFIG, ); - let ticket_master_address = deploy(ticket_master_class, calldata); - let ticket_master_dispatcher = ITicketMasterDispatcher { - contract_address: ticket_master_address, + let erc20_dispatcher = IERC20Dispatcher { + contract_address: ticket_master_dispatcher.contract_address, }; - let erc20_dispatcher = IERC20Dispatcher { contract_address: ticket_master_address }; - start_cheat_caller_address(ticket_master_address, DEPLOYER_ADDRESS); + // Premint tokens to deployer so they have tokens to burn let recipients: Array = array![DEPLOYER_ADDRESS]; let amounts: Array = array![1000000_u256]; ticket_master_dispatcher.premint_tokens(recipients, amounts); - stop_cheat_caller_address(ticket_master_address); let initial_supply = erc20_dispatcher.total_supply(); let burn_amount = 500000_u256; @@ -5886,17 +5823,15 @@ fn distribution_start_succeeds_with_minimal_tokens_for_distribution() { // change to OWNER start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); - let registry_token: u128 = 1_000_000_000_000_000_000; let recipient: ContractAddress = 'tiny_recipient'.try_into().unwrap(); let minimal_distribution = 10_000_000_000_000_000_u128; - let recipient_amount = total_supply - - registry_token - - INITIAL_LIQUIDITY_DUNGEON_TICKETS - - minimal_distribution; + // Registry token is no longer deducted from tokens_for_distribution + let recipient_amount = total_supply - INITIAL_LIQUIDITY_DUNGEON_TICKETS - minimal_distribution; ticket_master_dispatcher.premint_tokens(array![recipient], array![recipient_amount.into()]); stop_cheat_caller_address(ticket_master_dispatcher.contract_address); - let expected_tokens_before_liquidity = INITIAL_LIQUIDITY_DUNGEON_TICKETS.into() - minimal_distribution.into(); + let expected_tokens_before_liquidity = INITIAL_LIQUIDITY_DUNGEON_TICKETS.into() + + minimal_distribution.into(); assert_eq!( ticket_master_dispatcher.get_tokens_for_distribution(), expected_tokens_before_liquidity, ); From 9a5b6e9cd3689b3af1b3a430d780f1551624e06b Mon Sep 17 00:00:00 2001 From: loothero Date: Thu, 4 Dec 2025 10:03:36 -0800 Subject: [PATCH 3/7] feat: generalize reward distribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the velords-specific 80/20 proceeds split in favor of directing all proceeds to buybacks. This simplifies the distribution logic and makes the contract more flexible for different tokenomics configurations. Changes: - Remove velords_address from constructor, storage, and interface - Update distribute_proceeds to use 100% of proceeds for buybacks - Remove set_velords_address and get_velords_address functions - Update deployment script and .env.example - Update tests to reflect new constructor signature - Update README.md and AGENTS.md documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .env.example | 1 - AGENTS.md | 2 +- README.md | 17 +- scripts/deploy.sh | 192 ++++++++++++++--------- src/contract.cairo | 45 +----- src/interfaces.cairo | 2 - tests/constants.cairo | 1 - tests/helper.cairo | 6 - tests/test_contract.cairo | 316 +------------------------------------- 9 files changed, 133 insertions(+), 449 deletions(-) diff --git a/.env.example b/.env.example index 932c5db..189f9ca 100644 --- a/.env.example +++ b/.env.example @@ -31,7 +31,6 @@ PAYMENT_TOKEN="0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc POSITION_NFT_ADDRESS="0x04afc78d6fec3b122fc1f60276f074e557749df1a77a93416451be72c435120f" # Positions NFT (update per network; defaults to Sepolia guardian) BUYBACK_TOKEN="0x053b40a647cedfca6ca84f542a0fe36736031905a9639a7f19a3c1e66bfd5080" # USDC (Sepolia) TREASURY_ADDRESS="0x041bb7729efa185f2cab327de0a668886302f1d4969e3edf504c4741648f858b" -VELORDS_ADDRESS="0x041bb7729efa185f2cab327de0a668886302f1d4969e3edf504c4741648f858b" # Ekubo infrastructure (override to deploy on custom forks) EKUBO_CORE_ADDRESS="" diff --git a/AGENTS.md b/AGENTS.md index 00a07f5..f36c061 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ Adopt four-space indentation, grouped imports, and snake_case for functions/modu Favor positive and guard-path assertions for any new logic; regressions need reproducing tests. Unit helpers should live with their modules (e.g., TWAMM helpers in `src/utils.cairo`), while end-to-end scenarios stay under `tests/`. Name tests `test__` to keep failure output searchable. For fork tests, annotate with `#[fork("")]` and verify prerequisites such as approvals or oracle mocks. Leverage Foundry fuzzing and storage inspection when defending edge cases like low-issuance mode transitions. When adding new storage variables or getters (e.g., `liquidity_position_id`), ensure corresponding getter tests verify storage consistency after relevant state transitions. ## Commit & Pull Request Guidelines -Follow Conventional Commits (`feat:`, `fix:`, `refactor:`, `docs:`) with subjects under ~70 characters. Squash fixups locally and avoid merge commits in feature branches. PR descriptions should summarize context, cite the `snforge` commands run, link relevant issues, and highlight security-sensitive touchpoints (reentrancy, access control, math safety). Before requesting review, ensure formatting is clean, fork tests are green, and new parameters (e.g., oracle, veLords, position NFT addresses) are wired through constructors and deployment helpers. +Follow Conventional Commits (`feat:`, `fix:`, `refactor:`, `docs:`) with subjects under ~70 characters. Squash fixups locally and avoid merge commits in feature branches. PR descriptions should summarize context, cite the `snforge` commands run, link relevant issues, and highlight security-sensitive touchpoints (reentrancy, access control, math safety). Before requesting review, ensure formatting is clean, fork tests are green, and new parameters (e.g., oracle, position NFT addresses) are wired through constructors and deployment helpers. ## Security & Review Focus Validate oracle-driven low-issuance flows (`enable_low_issuance_mode`, `disable_low_issuance_mode`) with both entry and exit tests. Treat proceeds distribution, TWAMM interactions, and owner-only pathways as audit priorities—justify any departure from existing patterns. Confirm external calls (registries, Ekubo dispatchers, ERC20/ERC721 withdrawals) respect access control and cannot strand tokens. When touching deployment scripts, thread new addresses and ticks end-to-end to prevent misconfigured mainnet operations. diff --git a/README.md b/README.md index f6b7a4a..d9a6d71 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ constructor( extension_address: ContractAddress, registry_address: ContractAddress, oracle_address: ContractAddress, - velords_address: ContractAddress, issuance_reduction_price_x128: u256, issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, @@ -61,8 +60,7 @@ constructor( - Mints the distribution ERC20 to a configurable list of recipients and records the remainder for TWAMM execution (`tokens_for_distribution`) - Stores Ekubo dispatchers (core, positions, registry, extension), the associated position NFT - address, oracle access, the veLords revenue recipient, and bootstrap parameters for both the - distribution and buyback legs + address, oracle access, and bootstrap parameters for both the distribution and buyback legs - Defers pool ticks and seed liquidity to owner-only bootstrap calls so deployment-time pricing can be computed off-chain after the contract address is known - Validates and caches issuance throttling configuration: a Q128 price threshold (`issuance_reduction_price_x128`), @@ -102,7 +100,7 @@ The contract follows a strict four-phase deployment sequence: 4. **Recycle Proceeds** – Ongoing operations after distribution starts: - `claim_proceeds()`: Withdraws realized payment token sales from the distribution TWAMM order - - `distribute_proceeds(end_time)`: Splits proceeds 80% to buybacks and 20% to veLords, then creates a new TWAMM buyback order that starts immediately and runs until `end_time` + - `distribute_proceeds(end_time)`: Uses all proceeds to create a new TWAMM buyback order that starts immediately and runs until `end_time` - `claim_and_distribute_buybacks(limit)`: Iterates through matured buyback orders, withdrawing completed buyback tokens and forwarding them to the treasury address ### Buyback Order Configuration @@ -155,13 +153,12 @@ The on-chain interface (`ITicketMaster`) exposes: `get_distribution_end_time`, `get_distribution_initial_tick`, `get_dungeon_ticket_price_x128` - **Issuance telemetry**: `is_low_issuance_mode`, `get_issuance_reduction_price_x128`, `get_issuance_reduction_price_duration`, `get_issuance_reduction_bips` -- **Administrative controls**: `set_treasury_address`, `set_velords_address`, - `set_issuance_reduction_price_x128`, `set_issuance_reduction_price_duration`, - `set_issuance_reduction_bips`, `set_buyback_order_config`, +- **Administrative controls**: `set_treasury_address`, `set_issuance_reduction_price_x128`, + `set_issuance_reduction_price_duration`, `set_issuance_reduction_bips`, `set_buyback_order_config`, `withdraw_erc721`, `withdraw_erc20` - **Deployment helpers**: `get_deployed_at`, `get_payment_token`, `get_buyback_token`, `get_extension_address`, `get_core_dispatcher`, `get_positions_dispatcher`, - `get_registry_dispatcher`, `get_oracle_address`, `get_velords_address`, `get_treasury_address`, + `get_registry_dispatcher`, `get_oracle_address`, `get_treasury_address`, `is_pool_initialized`, `get_deployment_state` ### Time Utilities @@ -239,13 +236,13 @@ scarb fmt ## Security Considerations - **State machine guards**: Prevent re-entry into lifecycle phases out of order through strict `deployment_state` assertions -- **Address validation**: All external addresses (tokens, Ekubo contracts, treasury, veLords) are validated against the zero address during construction +- **Address validation**: All external addresses (tokens, Ekubo contracts, treasury) are validated against the zero address during construction - **Distribution supply protection**: Distribution supply is only minted when the TWAMM order is opened, preventing stranded balances - **Time alignment**: Clamps distribution windows and enforces Ekubo's maximum duration to prevent invalid TWAMM operations - **Issuance throttling safeguards**: Validates the configured oracle price floor, lookback duration, and basis-point reduction before mutating the distribution rate. Ensures reduction bips are less than `BIPS_BASIS` (10000) to prevent arithmetic errors - **Emergency controls**: The owner can use `withdraw_erc20` and `withdraw_erc721` to recover any ERC20 or ERC721 tokens from the contract - **Administrative flexibility**: The owner can adjust `issuance_reduction_price_duration` via `set_issuance_reduction_price_duration` to tune the oracle lookback period without redeployment -- **Revenue distribution**: The 20% veLords revenue share ships with a constructor-provided address that the owner can rotate post-deployment via `set_velords_address`. Treasury address can similarly be updated via `set_treasury_address` +- **Revenue distribution**: All proceeds are used for buybacks, with the resulting tokens sent to the treasury. The treasury address can be updated via `set_treasury_address` - **Registry integration**: Token registration with Ekubo's registry is part of deployment, ensuring the token metadata is discoverable on-chain ## Contributing diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 9dd0948..7125fee 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -170,10 +170,6 @@ PY } resolve_owner_address() { - if [ -n "${OWNER_ADDRESS:-}" ] && [ "${OWNER_ADDRESS}" != "0x0" ]; then - echo "$OWNER_ADDRESS" - return 0 - fi if command -v jq >/dev/null 2>&1 && [ -f "$STARKNET_ACCOUNT" ]; then local candidate candidate=$(jq -r '.deployment.address // .address // empty' "$STARKNET_ACCOUNT" 2>/dev/null || true) @@ -182,13 +178,18 @@ resolve_owner_address() { return 0 fi fi - print_error "Unable to determine OWNER_ADDRESS. Set OWNER_ADDRESS in your environment." + print_error "Unable to determine deployer address from $STARKNET_ACCOUNT" exit 1 } require_env STARKNET_NETWORK STARKNET_RPC STARKNET_ACCOUNT STARKNET_PK TOKEN_NAME TOKEN_SYMBOL TOKEN_SUPPLY PAYMENT_TOKEN BUYBACK_TOKEN TREASURY_ADDRESS -OWNER=$(resolve_owner_address) +DEPLOYER=$(resolve_owner_address) +FINAL_OWNER=${OWNER_ADDRESS:-$DEPLOYER} +print_info "Resolved deployer address: $DEPLOYER" +if [ "$FINAL_OWNER" != "$DEPLOYER" ]; then + print_info "Will transfer ownership to: $FINAL_OWNER" +fi TOKEN_NAME_ENC="bytearray:str:${TOKEN_NAME}" TOKEN_SYMBOL_ENC="bytearray:str:${TOKEN_SYMBOL}" TOTAL_SUPPLY=${TOKEN_SUPPLY} @@ -202,7 +203,6 @@ case "$STARKNET_NETWORK" in EXTENSION_ADDRESS_DEFAULT="0x073ec792c33b52d5f96940c2860d512b3884f2127d25e023eb9d44a678e4b971" REGISTRY_ADDRESS_DEFAULT="0x04484f91f0d2482bad844471ca8dc8e846d3a0211792322e72f21f0f44be63e5" ORACLE_ADDRESS_DEFAULT="0x003ccf3ee24638dd5f1a51ceb783e120695f53893f6fd947cc2dcabb3f86dc65" - VELORDS_ADDRESS_DEFAULT="" ;; mainnet) CORE_ADDRESS_DEFAULT="0x00000005dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b" @@ -210,7 +210,6 @@ case "$STARKNET_NETWORK" in EXTENSION_ADDRESS_DEFAULT="0x043e4f09c32d13d43a880e85f69f7de93ceda62d6cf2581a582c6db635548fdc" REGISTRY_ADDRESS_DEFAULT="0x064bdb4094881140bc39340146c5fcc5a187a98aec5a53f448ac702e5de5067e" ORACLE_ADDRESS_DEFAULT="0x005e470ff654d834983a46b8f29dfa99963d5044b993cb7b9c92243a69dab38f" - VELORDS_ADDRESS_DEFAULT="0x045c587318c9ebcf2fbe21febf288ee2e3597a21cd48676005a5770a50d433c5" ;; *) print_warn "Unknown network ${STARKNET_NETWORK}. Provide EKUBO_* environment overrides." @@ -219,7 +218,6 @@ case "$STARKNET_NETWORK" in EXTENSION_ADDRESS_DEFAULT="" REGISTRY_ADDRESS_DEFAULT="" ORACLE_ADDRESS_DEFAULT="" - VELORDS_ADDRESS_DEFAULT="" ;; esac @@ -228,7 +226,6 @@ POSITIONS_ADDRESS="${EKUBO_POSITIONS_ADDRESS:-$POSITIONS_ADDRESS_DEFAULT}" EXTENSION_ADDRESS="${EKUBO_TWAMM_EXTENSION_ADDRESS:-$EXTENSION_ADDRESS_DEFAULT}" REGISTRY_ADDRESS="${EKUBO_REGISTRY_ADDRESS:-$REGISTRY_ADDRESS_DEFAULT}" ORACLE_ADDRESS="${EKUBO_ORACLE_ADDRESS:-$ORACLE_ADDRESS_DEFAULT}" -VELORDS_ADDRESS="${EKUBO_VELORDS_ADDRESS:-$VELORDS_ADDRESS_DEFAULT}" if [ -z "${POSITION_NFT_ADDRESS:-}" ]; then POSITION_NFT_ADDRESS="$POSITIONS_ADDRESS" fi @@ -243,30 +240,36 @@ fi ISSUANCE_REDUCTION_PRICE_DURATION=${ISSUANCE_REDUCTION_PRICE_DURATION:-259200} ISSUANCE_REDUCTION_BIPS=${ISSUANCE_REDUCTION_BIPS:-2500} -RECIPIENTS_PARAM=(0) -AMOUNTS_PARAM=(0) +# Parse premint recipients and amounts if provided +PREMINT_RECIPIENTS=() +PREMINT_AMOUNTS=() if [ -n "${RECIPIENTS:-}" ] && [ -n "${AMOUNTS:-}" ]; then IFS=',' read -ra RECIPIENT_ARRAY <<< "${RECIPIENTS}" IFS=',' read -ra AMOUNT_ARRAY <<< "${AMOUNTS}" if [ ${#RECIPIENT_ARRAY[@]} -ne ${#AMOUNT_ARRAY[@]} ]; then - print_error "Recipients and amounts must have matching lengths" + print_error "RECIPIENTS and AMOUNTS must have matching lengths" exit 1 fi - RECIPIENTS_PARAM=("${#RECIPIENT_ARRAY[@]}") for recipient in "${RECIPIENT_ARRAY[@]}"; do recipient_trimmed="${recipient//[[:space:]]/}" if [ -z "$recipient_trimmed" ]; then print_error "Recipient address cannot be empty" exit 1 fi - RECIPIENTS_PARAM+=("$recipient_trimmed") + PREMINT_RECIPIENTS+=("$recipient_trimmed") done - AMOUNTS_PARAM=("${#AMOUNT_ARRAY[@]}") for amt in "${AMOUNT_ARRAY[@]}"; do amt_trimmed="${amt//[[:space:]]/}" - read -r low high < <(to_u256_parts "$amt_trimmed") - AMOUNTS_PARAM+=("$low" "$high") + if [ -z "$amt_trimmed" ]; then + print_error "Amount cannot be empty" + exit 1 + fi + PREMINT_AMOUNTS+=("$amt_trimmed") done + print_info "Premint configuration: ${#PREMINT_RECIPIENTS[@]} recipient(s)" +elif [ -n "${RECIPIENTS:-}" ] || [ -n "${AMOUNTS:-}" ]; then + print_error "Both RECIPIENTS and AMOUNTS must be provided together, or neither" + exit 1 fi DISTRIBUTION_END_TIME=${DISTRIBUTION_END_TIMESTAMP} @@ -287,9 +290,9 @@ if [[ "$INITIAL_PAYMENT_TOKEN_LIQUIDITY" =~ ^0+$ ]] || [[ "$INITIAL_DUNGEON_TICK exit 1 fi -TARGET_CLASS="target/dev/ticket_master_TicketMaster.contract_class.json" +TARGET_CLASS="/workspace/ticket-master/target/release/ticket_master_TicketMaster.contract_class.json" print_info "Building package" -scarb build +scarb --release build if [ ! -f "$TARGET_CLASS" ]; then print_error "Contract artifact not found at $TARGET_CLASS" exit 1 @@ -312,7 +315,7 @@ fi print_info "Class hash: $CLASS_HASH" CONSTRUCTOR_ARGS=( - "$OWNER" + "$DEPLOYER" "$TOKEN_NAME_ENC" "$TOKEN_SYMBOL_ENC" "$TOTAL_SUPPLY" @@ -325,17 +328,11 @@ CONSTRUCTOR_ARGS=( "$EXTENSION_ADDRESS" "$REGISTRY_ADDRESS" "$ORACLE_ADDRESS" - "$VELORDS_ADDRESS" "$ISSUANCE_PRICE_LOW" "$ISSUANCE_PRICE_HIGH" "$ISSUANCE_REDUCTION_PRICE_DURATION" "$ISSUANCE_REDUCTION_BIPS" "$TREASURY_ADDRESS" -) - -CONSTRUCTOR_ARGS+=("${RECIPIENTS_PARAM[@]}") -CONSTRUCTOR_ARGS+=("${AMOUNTS_PARAM[@]}") -CONSTRUCTOR_ARGS+=( "$DISTRIBUTION_END_TIME" "$BUYBACK_MIN_DELAY" "$BUYBACK_MAX_DELAY" @@ -347,7 +344,8 @@ CONSTRUCTOR_ARGS+=( print_info "Deployment parameters" echo " Network: $STARKNET_NETWORK" echo " RPC: $STARKNET_RPC" -echo " Owner: $OWNER" +echo " Deployer: $DEPLOYER" +echo " Final owner: $FINAL_OWNER" echo " Token: $TOKEN_NAME ($TOKEN_SYMBOL)" echo " Total supply: $TOTAL_SUPPLY" echo " Distribution fee: $DISTRIBUTION_POOL_FEE" @@ -360,7 +358,6 @@ echo " Position NFT: $POSITION_NFT_ADDRESS" echo " Extension: $EXTENSION_ADDRESS" echo " Registry: $REGISTRY_ADDRESS" echo " Oracle: $ORACLE_ADDRESS" -echo " Velords: $VELORDS_ADDRESS" echo " End time: $DISTRIBUTION_END_TIME" echo " Initial pay liq: $INITIAL_PAYMENT_TOKEN_LIQUIDITY" echo " Initial ticket liq: $INITIAL_DUNGEON_TICKET_LIQUIDITY" @@ -476,53 +473,100 @@ cat > "$DEPLOY_FILE" <&1 || true) -APPROVE_EXIT=$? -if [ $APPROVE_EXIT -ne 0 ]; then - print_error "Payment token approval failed" - echo "$APPROVE_OUTPUT" - exit 1 -fi -APPROVE_TX=$(echo "$APPROVE_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') -if [ -n "$APPROVE_TX" ]; then print_tx "$APPROVE_TX"; fi - -print_info "Initializing distribution pool" -INIT_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" init_distribution_pool "$DIST_TICK_MAG" "$DIST_TICK_SIGN" 2>&1 || true) -INIT_EXIT=$? -if [ $INIT_EXIT -ne 0 ]; then - print_error "init_distribution_pool failed" - echo "$INIT_OUTPUT" - exit 1 -fi -INIT_TX=$(echo "$INIT_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') -if [ -n "$INIT_TX" ]; then print_tx "$INIT_TX"; fi - -print_info "Providing initial liquidity" -echo " Payment token (wei): $INITIAL_PAYMENT_TOKEN_LIQUIDITY" -echo " Dungeon token (wei): $INITIAL_DUNGEON_TICKET_LIQUIDITY" -echo " Min liquidity: $INITIAL_MIN_LIQUIDITY" -#starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" provide_initial_liquidity "$INITIAL_PAYMENT_TOKEN_LIQUIDITY" "$INITIAL_DUNGEON_TICKET_LIQUIDITY" "$INITIAL_MIN_LIQUIDITY" -LIQ_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" provide_initial_liquidity "$INITIAL_PAYMENT_TOKEN_LIQUIDITY" "$INITIAL_DUNGEON_TICKET_LIQUIDITY" "$INITIAL_MIN_LIQUIDITY" 2>&1 || true) -LIQ_EXIT=$? -if [ $LIQ_EXIT -ne 0 ]; then - print_error "provide_initial_liquidity failed" - echo "$LIQ_OUTPUT" - exit 1 + +# Call premint_tokens if recipients and amounts were provided +if [ ${#PREMINT_RECIPIENTS[@]} -gt 0 ]; then + print_info "Preminting tokens to ${#PREMINT_RECIPIENTS[@]} recipient(s)" + + # Build the recipients array argument + RECIPIENTS_ARRAY_ARG="${#PREMINT_RECIPIENTS[@]}" + for recipient in "${PREMINT_RECIPIENTS[@]}"; do + RECIPIENTS_ARRAY_ARG="$RECIPIENTS_ARRAY_ARG $recipient" + done + + # Build the amounts array argument (convert each amount to u256) + AMOUNTS_ARRAY_ARG="${#PREMINT_AMOUNTS[@]}" + for amt in "${PREMINT_AMOUNTS[@]}"; do + read -r low high < <(to_u256_parts "$amt") + AMOUNTS_ARRAY_ARG="$AMOUNTS_ARRAY_ARG $low $high" + done + + # Call premint_tokens + PREMINT_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" premint_tokens $RECIPIENTS_ARRAY_ARG $AMOUNTS_ARRAY_ARG) + #PREMINT_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" premint_tokens $RECIPIENTS_ARRAY_ARG $AMOUNTS_ARRAY_ARG 2>&1 || true) + PREMINT_EXIT=$? + if [ $PREMINT_EXIT -ne 0 ]; then + print_error "premint_tokens failed" + echo "$PREMINT_OUTPUT" + exit 1 + fi + PREMINT_TX=$(echo "$PREMINT_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') + if [ -n "$PREMINT_TX" ]; then print_tx "$PREMINT_TX"; fi + print_info "Tokens preminted successfully" fi -LIQ_TX=$(echo "$LIQ_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') -if [ -n "$LIQ_TX" ]; then print_tx "$LIQ_TX"; fi - -print_info "Starting token distribution" -DIST_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" start_token_distribution 2>&1 || true) -DIST_EXIT=$? -if [ $DIST_EXIT -ne 0 ]; then - print_error "start_token_distribution failed" - echo "$DIST_OUTPUT" - exit 1 + +# Transfer ownership to final owner if different from deployer +if [ "$FINAL_OWNER" != "$DEPLOYER" ]; then + print_info "Transferring ownership to $FINAL_OWNER" + TRANSFER_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" transfer_ownership "$FINAL_OWNER" 2>&1 || true) + TRANSFER_EXIT=$? + if [ $TRANSFER_EXIT -ne 0 ]; then + print_error "transfer_ownership failed" + echo "$TRANSFER_OUTPUT" + exit 1 + fi + TRANSFER_TX=$(echo "$TRANSFER_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') + if [ -n "$TRANSFER_TX" ]; then print_tx "$TRANSFER_TX"; fi + print_info "Ownership transferred successfully" fi -DIST_TX=$(echo "$DIST_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') -if [ -n "$DIST_TX" ]; then print_tx "$DIST_TX"; fi + +# print_info "Approving payment token" +# APPROVE_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$PAYMENT_TOKEN" approve "$CONTRACT_ADDRESS" u256:$INITIAL_PAYMENT_TOKEN_LIQUIDITY 2>&1 || true) +# APPROVE_EXIT=$? +# if [ $APPROVE_EXIT -ne 0 ]; then +# print_error "Payment token approval failed" +# echo "$APPROVE_OUTPUT" +# exit 1 +# fi +# APPROVE_TX=$(echo "$APPROVE_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') +# if [ -n "$APPROVE_TX" ]; then print_tx "$APPROVE_TX"; fi + +# print_info "Initializing distribution pool" +# INIT_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" init_distribution_pool "$DIST_TICK_MAG" "$DIST_TICK_SIGN" 2>&1 || true) +# INIT_EXIT=$? +# if [ $INIT_EXIT -ne 0 ]; then +# print_error "init_distribution_pool failed" +# echo "$INIT_OUTPUT" +# exit 1 +# fi +# INIT_TX=$(echo "$INIT_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') +# if [ -n "$INIT_TX" ]; then print_tx "$INIT_TX"; fi + +# print_info "Providing initial liquidity" +# echo " Payment token (wei): $INITIAL_PAYMENT_TOKEN_LIQUIDITY" +# echo " Dungeon token (wei): $INITIAL_DUNGEON_TICKET_LIQUIDITY" +# echo " Min liquidity: $INITIAL_MIN_LIQUIDITY" +# #starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" provide_initial_liquidity "$INITIAL_PAYMENT_TOKEN_LIQUIDITY" "$INITIAL_DUNGEON_TICKET_LIQUIDITY" "$INITIAL_MIN_LIQUIDITY" +# LIQ_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" provide_initial_liquidity "$INITIAL_PAYMENT_TOKEN_LIQUIDITY" "$INITIAL_DUNGEON_TICKET_LIQUIDITY" "$INITIAL_MIN_LIQUIDITY" 2>&1 || true) +# LIQ_EXIT=$? +# if [ $LIQ_EXIT -ne 0 ]; then +# print_error "provide_initial_liquidity failed" +# echo "$LIQ_OUTPUT" +# exit 1 +# fi +# LIQ_TX=$(echo "$LIQ_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') +# if [ -n "$LIQ_TX" ]; then print_tx "$LIQ_TX"; fi + +# print_info "Starting token distribution" +# DIST_OUTPUT=$(starkli invoke --watch --account "$STARKNET_ACCOUNT" --private-key "$STARKNET_PK" --rpc "$STARKNET_RPC" "$CONTRACT_ADDRESS" start_token_distribution 2>&1 || true) +# DIST_EXIT=$? +# if [ $DIST_EXIT -ne 0 ]; then +# print_error "start_token_distribution failed" +# echo "$DIST_OUTPUT" +# exit 1 +# fi +# DIST_TX=$(echo "$DIST_OUTPUT" | grep -oE 'transaction: 0x[0-9a-fA-F]+' | head -1 | awk '{print $2}') +# if [ -n "$DIST_TX" ]; then print_tx "$DIST_TX"; fi print_info "Deployment workflow complete" print_info "Deployment details saved to $DEPLOY_FILE" diff --git a/src/contract.cairo b/src/contract.cairo index 2b312a7..a6bf910 100644 --- a/src/contract.cairo +++ b/src/contract.cairo @@ -71,7 +71,6 @@ pub mod TicketMaster { pub deployment_state: u8, // State machine: 0=initial, 1=pool_initialized, 2=liquidity_provided, 3=distribution_started pub tokens_for_distribution: u256, // Tokens to mint for TWAMM distribution pub treasury_address: ContractAddress, - pub velords_address: ContractAddress, pub buyback_order_config: BuybackOrderConfig, } @@ -97,7 +96,6 @@ pub mod TicketMaster { /// @param extension_address The address of the Ekubo extension contract /// @param registry_address The address of the Ekubo registry contract /// @param oracle_address The address of the Ekubo oracle contract - /// @param velords_address The address that receives the veLords proceeds share /// @param position_nft_address The address of the ERC721 contract that minted the distribution /// position token /// @param issuance_reduction_price_x128 The 3-day average price threshold (Q128) that triggers @@ -124,7 +122,6 @@ pub mod TicketMaster { extension_address: ContractAddress, registry_address: ContractAddress, oracle_address: ContractAddress, - velords_address: ContractAddress, issuance_reduction_price_x128: u256, issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, @@ -142,7 +139,6 @@ pub mod TicketMaster { assert(extension_address != zero_address, 'Invalid extension address'); assert(registry_address != zero_address, 'Invalid registry address'); assert(oracle_address != zero_address, 'Invalid oracle address'); - assert(velords_address != zero_address, 'Invalid veLords address'); assert(treasury_address != zero_address, 'Invalid treasury address'); assert(total_supply > 0, 'Invalid total supply'); @@ -172,7 +168,6 @@ pub mod TicketMaster { .registry_dispatcher .write(ITokenRegistryDispatcher { contract_address: registry_address }); self.treasury_address.write(treasury_address); - self.velords_address.write(velords_address); self.oracle_address.write(IOracleDispatcher { contract_address: oracle_address }); assert(issuance_reduction_bips < BIPS_BASIS, Errors::INVALID_REDUCTION_BIPS); self.issuance_reduction_price_x128.write(issuance_reduction_price_x128); @@ -334,7 +329,7 @@ pub mod TicketMaster { proceeds } - /// @notice Distributes the proceeds from selling tokens to the veLords and buybacks + /// @notice Distributes the proceeds from selling tokens to buybacks /// @dev This function should be called periodically to distribute proceeds /// @dev start time for the order is 0 which will start order immediately /// @param end_time The end time of the order @@ -356,24 +351,17 @@ pub mod TicketMaster { assert(proceeds > 0, 'No proceeds available'); - let amount_to_velords = proceeds / 5; - let amount_to_buybacks = proceeds - amount_to_velords; - - let velords_address = self.velords_address.read(); - // send 20% to veLords - payment_token_dispatcher.transfer(velords_address, amount_to_velords); - - // use the remainder to buy back the reward token via DCA - // start by moving the remaining proceeds to positions contract + // use all proceeds to buy back the reward token via DCA + // start by moving the proceeds to positions contract let positions_dispatcher = self.positions_dispatcher.read(); payment_token_dispatcher - .transfer(positions_dispatcher.contract_address, amount_to_buybacks); + .transfer(positions_dispatcher.contract_address, proceeds); let position_token_id = self.position_token_id.read(); let order_key = _get_buyback_order_key(@self, 0, end_time); let sale_rate_increase = positions_dispatcher .increase_sell_amount( - position_token_id, order_key, amount_to_buybacks.try_into().unwrap(), + position_token_id, order_key, proceeds.try_into().unwrap(), ); // Update the rewards distribution rate @@ -391,7 +379,7 @@ pub mod TicketMaster { self.buyback_order_key_counter.write(order_index + 1); } - /// @notice Claims the proceeds from selling tokens and distributes them to the veLords and + /// @notice Claims the proceeds from buyback orders and sends them to the treasury /// @param limit The maximum number of buyback orders to claim /// @dev If limit is 0, all buyback orders will be claimed /// @return u128 The amount of proceeds claimed @@ -534,16 +522,6 @@ pub mod TicketMaster { self.treasury_address.write(treasury_address); } - /// @notice Updates the veLords distribution recipient address - /// @param velords_address The new veLords recipient address - fn set_velords_address(ref self: ContractState, velords_address: ContractAddress) { - self.ownable.assert_only_owner(); - let zero_address: ContractAddress = 0.try_into().unwrap(); - assert(velords_address != zero_address, Errors::INVALID_RECIPIENT); - - self.velords_address.write(velords_address); - } - /// @notice Withdraws ERC20 tokens from the contract /// @param token_address The address of the ERC20 token /// @param amount The amount of tokens to withdraw @@ -743,12 +721,6 @@ pub mod TicketMaster { _get_treasury_address(self) } - /// @notice Returns the address that receives the veLords share - /// @return ContractAddress The veLords recipient address - fn get_velords_address(self: @ContractState) -> ContractAddress { - _get_velords_address(self) - } - fn get_buyback_order_key_counter(self: @ContractState) -> u128 { _get_buyback_order_key_counter(self) } @@ -1019,11 +991,6 @@ pub mod TicketMaster { self.treasury_address.read() } - #[inline(always)] - fn _get_velords_address(self: @ContractState) -> ContractAddress { - self.velords_address.read() - } - #[inline(always)] fn _get_buyback_order_key_counter(self: @ContractState) -> u128 { self.buyback_order_key_counter.read() diff --git a/src/interfaces.cairo b/src/interfaces.cairo index c05bef6..3369e19 100644 --- a/src/interfaces.cairo +++ b/src/interfaces.cairo @@ -34,7 +34,6 @@ pub trait ITicketMaster { fn set_issuance_reduction_price_duration(ref self: TContractState, duration: u64); fn set_issuance_reduction_bips(ref self: TContractState, bips: u128); fn set_treasury_address(ref self: TContractState, treasury_address: ContractAddress); - fn set_velords_address(ref self: TContractState, velords_address: ContractAddress); fn withdraw_erc20(ref self: TContractState, token_address: ContractAddress, amount: u256); fn withdraw_erc721(ref self: TContractState, token_address: ContractAddress, token_id: u256); fn get_token_distribution_rate(self: @TContractState) -> u128; @@ -63,7 +62,6 @@ pub trait ITicketMaster { fn get_oracle_address(self: @TContractState) -> IOracleDispatcher; fn get_tokens_for_distribution(self: @TContractState) -> u256; fn get_treasury_address(self: @TContractState) -> ContractAddress; - fn get_velords_address(self: @TContractState) -> ContractAddress; fn get_distribution_pool_key_hash(self: @TContractState) -> felt252; fn is_pool_initialized(self: @TContractState) -> bool; fn get_deployment_state(self: @TContractState) -> u8; diff --git a/tests/constants.cairo b/tests/constants.cairo index b74addc..e08d3c4 100644 --- a/tests/constants.cairo +++ b/tests/constants.cairo @@ -80,7 +80,6 @@ pub const EKUBO_ORACLE_SEPOLIA: ContractAddress = .unwrap(); pub const MOCK_TREASURY: ContractAddress = 'treasury'.try_into().unwrap(); -pub const MOCK_VELORDS_ADDRESS: ContractAddress = 'velords'.try_into().unwrap(); pub const MAINNET_TREASURY: ContractAddress = 0x041bb7729efa185f2cab327de0a668886302f1d4969e3edf504c4741648f858b diff --git a/tests/helper.cairo b/tests/helper.cairo index 4fd8192..a4aa9fa 100644 --- a/tests/helper.cairo +++ b/tests/helper.cairo @@ -17,7 +17,6 @@ pub fn setup( extension_address: ContractAddress, registry_address: ContractAddress, oracle_address: ContractAddress, - velords_address: ContractAddress, issuance_reduction_price_x128: u256, issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, @@ -47,7 +46,6 @@ pub fn setup( extension_address, registry_address, oracle_address, - velords_address, issuance_reduction_price_x128, issuance_reduction_price_duration, issuance_reduction_bips, @@ -125,7 +123,6 @@ pub fn ticket_master_calldata_custom( extension_address: ContractAddress, registry_address: ContractAddress, oracle_address: ContractAddress, - velords_address: ContractAddress, issuance_reduction_price_x128: u256, issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, @@ -148,7 +145,6 @@ pub fn ticket_master_calldata_custom( extension_address.serialize(ref calldata); registry_address.serialize(ref calldata); oracle_address.serialize(ref calldata); - velords_address.serialize(ref calldata); issuance_reduction_price_x128.serialize(ref calldata); issuance_reduction_price_duration.serialize(ref calldata); issuance_reduction_bips.serialize(ref calldata); @@ -168,7 +164,6 @@ pub fn ticket_master_calldata( extension_address: ContractAddress, registry_address: ContractAddress, oracle_address: ContractAddress, - velords_address: ContractAddress, issuance_reduction_price_x128: u256, issuance_reduction_price_duration: u64, issuance_reduction_bips: u128, @@ -196,7 +191,6 @@ pub fn ticket_master_calldata( extension_address, registry_address, oracle_address, - velords_address, issuance_reduction_price_x128, issuance_reduction_price_duration, issuance_reduction_bips, diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index 72dda89..f402052 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -25,7 +25,7 @@ use super::constants::{ MAINNET_POSITION_NFT_ADDRESS, MAINNET_REGISTRY_ADDRESS, MAINNET_TREASURY, MAINNET_TWAMM_EXTENSION_ADDRESS, MOCK_CORE_ADDRESS, MOCK_POSITIONS_ADDRESS, MOCK_POSITION_NFT_ADDRESS, MOCK_REGISTRY_ADDRESS, MOCK_TREASURY, MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_VELORDS_ADDRESS, PAYMENT_TOKEN_INITIAL_SUPPLY, REWARD_TOKEN_INITIAL_SUPPLY, ZERO_ADDRESS, + PAYMENT_TOKEN_INITIAL_SUPPLY, REWARD_TOKEN_INITIAL_SUPPLY, ZERO_ADDRESS, }; use super::helper::{ declare_class, deploy, mock_ekubo_core, panic_data_to_byte_array, setup, @@ -64,7 +64,6 @@ fn constructor_sets_initial_state() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -97,10 +96,6 @@ fn constructor_sets_initial_state() { "buyback token mismatch", ); assert!(ticket_master_dispatcher.get_treasury_address() == MOCK_TREASURY, "treasury mismatch"); - assert!( - ticket_master_dispatcher.get_velords_address() == MOCK_VELORDS_ADDRESS, - "veLords address mismatch", - ); assert!( ticket_master_dispatcher.get_core_dispatcher().contract_address == MOCK_CORE_ADDRESS, "core dispatcher mismatch", @@ -193,7 +188,6 @@ fn premint_tokens_distributes_correctly() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -260,7 +254,6 @@ fn premint_tokens_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -314,7 +307,6 @@ fn premint_tokens_rejects_after_state_transition() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -370,7 +362,6 @@ fn premint_tokens_can_be_called_multiple_times_in_state_0() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -439,7 +430,6 @@ fn burn_reduces_balance_and_total_supply() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -511,7 +501,6 @@ fn burn_from_reduces_balance_and_total_supply() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -593,7 +582,6 @@ fn burn_from_rejects_without_allowance() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -662,7 +650,6 @@ fn fuzz_constructor_valid_configs( MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -712,7 +699,6 @@ fn constructor_rejects_zero_payment_token() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -751,7 +737,6 @@ fn constructor_rejects_zero_reward_token() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -794,7 +779,6 @@ fn constructor_rejects_zero_core_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -837,7 +821,6 @@ fn constructor_rejects_zero_positions_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -880,7 +863,6 @@ fn constructor_rejects_zero_position_nft_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -923,7 +905,6 @@ fn constructor_rejects_zero_extension_address() { ZERO_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -964,7 +945,6 @@ fn constructor_rejects_zero_registry_address() { MOCK_TWAMM_EXTENSION_ADDRESS, ZERO_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1007,7 +987,6 @@ fn constructor_rejects_zero_oracle_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, ZERO_ADDRESS, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1020,49 +999,6 @@ fn constructor_rejects_zero_oracle_address() { assert_constructor_revert_with_message(deploy_result, 'Invalid oracle address'); } -#[test] -fn constructor_rejects_zero_velords_address() { - start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - - let erc20_class = declare_class("ERC20Mock"); - let payment_token_address = deploy( - erc20_class, - token_calldata("Payment Token", "PT", PAYMENT_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - let reward_token_address = deploy( - erc20_class, - token_calldata("Reward Token", "RT", REWARD_TOKEN_INITIAL_SUPPLY, DEPLOYER_ADDRESS), - ); - - let ticket_master_class = declare_class("TicketMaster"); - - let calldata = ticket_master_calldata_custom( - DEPLOYER_ADDRESS, - "Beasts Dungeon Ticket", - "BDT", - DUNGEON_TICKET_SUPPLY, - DISTRIBUTION_POOL_FEE_BPS, - payment_token_address, - reward_token_address, - MOCK_CORE_ADDRESS, - MOCK_POSITIONS_ADDRESS, - MOCK_POSITION_NFT_ADDRESS, - MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_REGISTRY_ADDRESS, - EKUBO_ORACLE_MAINNET, - ZERO_ADDRESS, - ISSUANCE_REDUCTION_PRICE_X128, - ISSUANCE_REDUCTION_PRICE_DURATION, - ISSUANCE_REDUCTION_BIPS, - MOCK_TREASURY, - DISTRIBUTION_END_TIME, - BUYBACK_ORDER_CONFIG, - ); - - let deploy_result = ticket_master_class.deploy(@calldata); - assert_constructor_revert_with_message(deploy_result, 'Invalid veLords address'); -} - #[test] fn constructor_rejects_zero_treasury_address() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); @@ -1093,7 +1029,6 @@ fn constructor_rejects_zero_treasury_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1118,7 +1053,6 @@ fn constructor_rejects_mismatched_lengths() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1166,7 +1100,6 @@ fn constructor_rejects_end_before_now() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1223,7 +1156,6 @@ fn constructor_rejects_end_past_max_duration() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1248,7 +1180,6 @@ fn constructor_rejects_zero_recipient() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1275,7 +1206,6 @@ fn constructor_rejects_distribution_exceeding_supply() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1321,7 +1251,6 @@ fn constructor_rejects_zero_total_supply() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1364,7 +1293,6 @@ fn constructor_rejects_reduction_bips_at_limit() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, BIPS_BASIS, // issuance_reduction_bips at limit (should reject) @@ -1407,7 +1335,6 @@ fn constructor_accepts_reduction_bips_boundary() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, BIPS_BASIS - 1, // issuance_reduction_bips at boundary (should accept) @@ -1443,7 +1370,6 @@ fn provide_initial_liquidity_rejects_insufficient_remaining_supply() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1479,7 +1405,6 @@ fn provide_initial_liquidity_rejects_when_tokens_insufficient() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1513,7 +1438,6 @@ fn provide_initial_liquidity_rejects_zero_payment_amount() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1541,7 +1465,6 @@ fn provide_initial_liquidity_rejects_zero_dungeon_amount() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1568,7 +1491,6 @@ fn init_distribution_pool_sets_state() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1597,7 +1519,6 @@ fn init_distribution_pool_wrong_state() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1622,7 +1543,6 @@ fn init_distribution_pool_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1649,7 +1569,6 @@ fn provide_initial_liquidity_happy_path() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1702,7 +1621,6 @@ fn provide_initial_liquidity_wrong_state() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1730,7 +1648,6 @@ fn provide_initial_liquidity_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1765,7 +1682,6 @@ fn provide_initial_liquidity_without_pool_id() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1831,7 +1747,6 @@ fn test_provide_initial_liquidity_consumes_stored_config( MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1907,7 +1822,6 @@ fn test_provide_initial_liquidity_updates_tokens_for_distribution() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1969,7 +1883,6 @@ fn start_token_distribution_wrong_state() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -1991,7 +1904,6 @@ fn start_token_distribution_without_pool() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2020,7 +1932,6 @@ fn start_token_distribution_happy_path() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2072,7 +1983,6 @@ fn get_deployment_state_transitions_correctly() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2139,7 +2049,6 @@ fn init_distribution_pool_cannot_be_called_twice() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2165,7 +2074,6 @@ fn provide_initial_liquidity_requires_state_1() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2195,7 +2103,6 @@ fn provide_initial_liquidity_cannot_be_called_twice() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2242,7 +2149,6 @@ fn start_token_distribution_requires_state_2() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2269,7 +2175,6 @@ fn start_token_distribution_cannot_be_called_twice() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2312,7 +2217,6 @@ fn withdraw_erc721_owner_fork() { MAINNET_TWAMM_EXTENSION_ADDRESS, MAINNET_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2367,7 +2271,6 @@ fn withdraw_erc721_not_owner_fork() { MAINNET_TWAMM_EXTENSION_ADDRESS, MAINNET_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2422,7 +2325,6 @@ fn claim_proceeds_before_pool_initialized() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2445,7 +2347,6 @@ fn claim_proceeds_before_distribution_started() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2469,7 +2370,6 @@ fn claim_proceeds_returns_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2517,7 +2417,6 @@ fn low_issuance_mode_adjusts_distribution_rate() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2613,7 +2512,6 @@ fn enable_low_issuance_mode_rejects_before_distribution_started() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2654,7 +2552,6 @@ fn enable_low_issuance_mode_rejects_when_already_active() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2704,7 +2601,6 @@ fn enable_low_issuance_mode_rejects_when_price_not_below_threshold() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2752,7 +2648,6 @@ fn enable_low_issuance_mode_rejects_when_price_equals_threshold() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2803,7 +2698,6 @@ fn enable_low_issuance_mode_succeeds_when_price_below_threshold() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2859,7 +2753,6 @@ fn disable_low_issuance_mode_rejects_when_not_active() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2904,7 +2797,6 @@ fn disable_low_issuance_mode_rejects_when_price_not_above_threshold() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -2957,7 +2849,6 @@ fn disable_low_issuance_mode_rejects_when_price_equals_threshold() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3015,7 +2906,6 @@ fn disable_low_issuance_mode_rejects_when_no_tickets_available() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3082,7 +2972,6 @@ fn disable_low_issuance_mode_succeeds_when_price_above_threshold() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3158,7 +3047,6 @@ fn force_enable_low_issuance_mode_succeeds_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3212,7 +3100,6 @@ fn force_enable_low_issuance_mode_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3260,7 +3147,6 @@ fn force_disable_low_issuance_mode_succeeds_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3331,7 +3217,6 @@ fn force_disable_low_issuance_mode_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3392,7 +3277,6 @@ fn set_issuance_reduction_price_duration_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3417,7 +3301,6 @@ fn set_issuance_reduction_price_duration_rejects_zero() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3439,7 +3322,6 @@ fn set_issuance_reduction_price_duration_succeeds() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3473,7 +3355,6 @@ fn set_issuance_reduction_price_x128_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3498,7 +3379,6 @@ fn set_issuance_reduction_price_x128_rejects_zero() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3520,7 +3400,6 @@ fn set_issuance_reduction_price_x128_succeeds() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3553,7 +3432,6 @@ fn set_issuance_reduction_bips_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3578,7 +3456,6 @@ fn set_issuance_reduction_bips_rejects_zero() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3601,7 +3478,6 @@ fn set_issuance_reduction_bips_rejects_exceeds_basis() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3623,7 +3499,6 @@ fn set_issuance_reduction_bips_succeeds() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3641,62 +3516,6 @@ fn set_issuance_reduction_bips_succeeds() { assert_eq!(ticket_master_dispatcher.get_issuance_reduction_bips(), new_bips); } -#[test] -#[should_panic(expected: ('Caller is not the owner',))] -fn set_velords_address_rejects_non_owner() { - start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - let NON_OWNER_ADDRESS: ContractAddress = 'non_owner'.try_into().unwrap(); - - let (ticket_master_dispatcher, _, _) = setup( - MOCK_CORE_ADDRESS, - MOCK_POSITIONS_ADDRESS, - MOCK_POSITION_NFT_ADDRESS, - MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_REGISTRY_ADDRESS, - EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, - ISSUANCE_REDUCTION_PRICE_X128, - ISSUANCE_REDUCTION_PRICE_DURATION, - ISSUANCE_REDUCTION_BIPS, - MOCK_TREASURY, - ); - - // Try to set velords address as non-owner - let new_velords_address: ContractAddress = 0x999.try_into().unwrap(); - start_cheat_caller_address(ticket_master_dispatcher.contract_address, NON_OWNER_ADDRESS); - ticket_master_dispatcher.set_velords_address(new_velords_address); - stop_cheat_caller_address(ticket_master_dispatcher.contract_address); -} - -#[test] -fn set_velords_address_succeeds() { - start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - - let (ticket_master_dispatcher, _, _) = setup( - MOCK_CORE_ADDRESS, - MOCK_POSITIONS_ADDRESS, - MOCK_POSITION_NFT_ADDRESS, - MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_REGISTRY_ADDRESS, - EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, - ISSUANCE_REDUCTION_PRICE_X128, - ISSUANCE_REDUCTION_PRICE_DURATION, - ISSUANCE_REDUCTION_BIPS, - MOCK_TREASURY, - ); - - // Verify initial velords address - assert_eq!(ticket_master_dispatcher.get_velords_address(), MOCK_VELORDS_ADDRESS); - - // Set new velords address - let new_velords_address: ContractAddress = 0x999.try_into().unwrap(); - ticket_master_dispatcher.set_velords_address(new_velords_address); - - // Verify address was updated - assert_eq!(ticket_master_dispatcher.get_velords_address(), new_velords_address); -} - #[test] #[should_panic(expected: ('Caller is not the owner',))] fn withdraw_erc20_rejects_non_owner() { @@ -3710,7 +3529,6 @@ fn withdraw_erc20_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3734,7 +3552,6 @@ fn withdraw_erc20_succeeds_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3781,7 +3598,6 @@ fn withdraw_erc20_can_withdraw_full_balance() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3816,7 +3632,6 @@ fn distribute_proceeds_before_pool_initialized() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3839,7 +3654,6 @@ fn distribute_proceeds_before_distribution_started() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3868,7 +3682,6 @@ fn distribute_proceeds_rejects_expired_end_time() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3916,7 +3729,6 @@ fn distribute_proceeds_rejects_duration_too_short() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -3964,7 +3776,6 @@ fn distribute_proceeds_rejects_duration_too_long() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4012,7 +3823,6 @@ fn distribute_proceeds_rejects_when_no_balance() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4061,7 +3871,6 @@ fn fuzz_buyback_claim_limits( MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4210,7 +4019,6 @@ fn claim_and_distribute_buybacks_claims_limited_matured_orders() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4263,7 +4071,6 @@ fn claim_and_distribute_buybacks_limit_zero_claims_remaining() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4312,7 +4119,6 @@ fn test_claim_and_distribute_buybacks_success_path() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4358,7 +4164,6 @@ fn claim_and_distribute_buybacks_when_all_claimed() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4385,7 +4190,6 @@ fn test_claim_and_distribute_buybacks_without_mature_proceeds() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4418,7 +4222,6 @@ fn set_treasury_address_updates_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4447,7 +4250,6 @@ fn set_treasury_address_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4473,7 +4275,6 @@ fn set_treasury_address_no_zero_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4499,7 +4300,6 @@ fn set_issuance_reduction_price_x128_updates_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4524,7 +4324,6 @@ fn set_issuance_reduction_price_x128_rejects_zero_price() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4545,7 +4344,6 @@ fn set_issuance_reduction_bips_updates_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4570,7 +4368,6 @@ fn set_issuance_reduction_bips_rejects_zero_bips() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4592,7 +4389,6 @@ fn set_issuance_reduction_bips_rejects_bips_above_limit() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4617,7 +4413,6 @@ fn get_token_distribution_rate_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4639,7 +4434,6 @@ fn get_buyback_rate_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4661,7 +4455,6 @@ fn get_distribution_end_time_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4683,7 +4476,6 @@ fn get_pool_id_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4705,7 +4497,6 @@ fn get_position_token_id_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4727,7 +4518,6 @@ fn get_payment_token_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4753,7 +4543,6 @@ fn get_buyback_token_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4779,7 +4568,6 @@ fn get_extension_address_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4801,7 +4589,6 @@ fn get_issuance_reduction_price_x128_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4825,7 +4612,6 @@ fn is_low_issuance_mode_returns_false_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4847,7 +4633,6 @@ fn get_treasury_address_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4858,28 +4643,6 @@ fn get_treasury_address_returns_configured_value() { assert_eq!(treasury, MOCK_TREASURY, "Treasury address should match constructor value"); } -#[test] -fn get_velords_address_returns_configured_value() { - start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - - let (ticket_master_dispatcher, _, _) = setup( - MOCK_CORE_ADDRESS, - MOCK_POSITIONS_ADDRESS, - MOCK_POSITION_NFT_ADDRESS, - MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_REGISTRY_ADDRESS, - EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, - ISSUANCE_REDUCTION_PRICE_X128, - ISSUANCE_REDUCTION_PRICE_DURATION, - ISSUANCE_REDUCTION_BIPS, - MOCK_TREASURY, - ); - - let velords = ticket_master_dispatcher.get_velords_address(); - assert_eq!(velords, MOCK_VELORDS_ADDRESS, "VeLords address should match constructor value"); -} - #[test] fn get_position_nft_address_returns_configured_value() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); @@ -4891,7 +4654,6 @@ fn get_position_nft_address_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4913,7 +4675,6 @@ fn get_issuance_reduction_bips_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4935,7 +4696,6 @@ fn get_deployment_state_returns_initial_state() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4957,7 +4717,6 @@ fn is_pool_initialized_returns_false_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -4979,7 +4738,6 @@ fn get_buyback_order_key_counter_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5001,7 +4759,6 @@ fn get_buyback_order_key_bookmark_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5023,7 +4780,6 @@ fn get_unclaimed_buyback_orders_count_returns_zero_initially() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5045,7 +4801,6 @@ fn get_distribution_pool_fee_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5069,7 +4824,6 @@ fn get_buyback_order_config_returns_configured_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5095,7 +4849,6 @@ fn get_core_dispatcher_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5117,7 +4870,6 @@ fn get_positions_dispatcher_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5143,7 +4895,6 @@ fn get_registry_dispatcher_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5169,7 +4920,6 @@ fn get_oracle_address_returns_configured_address() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5193,7 +4943,6 @@ fn get_tokens_for_distribution_returns_initial_value() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5221,7 +4970,6 @@ fn burn_reduces_total_supply() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5260,7 +5008,6 @@ fn burn_reverts_when_insufficient_balance() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5306,7 +5053,6 @@ fn burn_from_reduces_target_balance() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5377,7 +5123,6 @@ fn burn_from_reverts_without_approval() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5415,7 +5160,6 @@ fn set_issuance_reduction_bips_accepts_bips_at_limit() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5427,52 +5171,6 @@ fn set_issuance_reduction_bips_accepts_bips_at_limit() { assert_eq!(ticket_master_dispatcher.get_issuance_reduction_bips(), BIPS_BASIS); } -#[test] -fn set_velords_address_updates_for_owner() { - start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - - let (ticket_master_dispatcher, _, _) = setup( - MOCK_CORE_ADDRESS, - MOCK_POSITIONS_ADDRESS, - MOCK_POSITION_NFT_ADDRESS, - MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_REGISTRY_ADDRESS, - EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, - ISSUANCE_REDUCTION_PRICE_X128, - ISSUANCE_REDUCTION_PRICE_DURATION, - ISSUANCE_REDUCTION_BIPS, - MOCK_TREASURY, - ); - - let new_velords: ContractAddress = 'new_velords'.try_into().unwrap(); - ticket_master_dispatcher.set_velords_address(new_velords); - - assert_eq!(ticket_master_dispatcher.get_velords_address(), new_velords); -} - -#[test] -#[should_panic(expected: 'invalid recipient')] -fn set_velords_address_rejects_zero_address() { - start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); - - let (ticket_master_dispatcher, _, _) = setup( - MOCK_CORE_ADDRESS, - MOCK_POSITIONS_ADDRESS, - MOCK_POSITION_NFT_ADDRESS, - MOCK_TWAMM_EXTENSION_ADDRESS, - MOCK_REGISTRY_ADDRESS, - EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, - ISSUANCE_REDUCTION_PRICE_X128, - ISSUANCE_REDUCTION_PRICE_DURATION, - ISSUANCE_REDUCTION_BIPS, - MOCK_TREASURY, - ); - - ticket_master_dispatcher.set_velords_address(ZERO_ADDRESS); -} - #[test] fn set_buyback_order_config_updates_for_owner() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); @@ -5484,7 +5182,6 @@ fn set_buyback_order_config_updates_for_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5520,7 +5217,6 @@ fn set_buyback_order_config_rejects_non_owner() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5551,7 +5247,6 @@ fn test_get_distribution_end_time_after_constructor() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5572,7 +5267,6 @@ fn get_distribution_pool_key_respects_token_ordering() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5606,7 +5300,6 @@ fn pause_like_behavior_via_owner_change() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5670,7 +5363,6 @@ fn insufficient_payment_tokens_edge() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5738,7 +5430,6 @@ fn test_start_token_distribution_without_tokens() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5803,7 +5494,6 @@ fn distribution_start_succeeds_with_minimal_tokens_for_distribution() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -5897,7 +5587,6 @@ fn simple_mainnet() { MAINNET_TWAMM_EXTENSION_ADDRESS, MAINNET_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -6008,7 +5697,6 @@ fn mainnet_full() { MAINNET_TWAMM_EXTENSION_ADDRESS, MAINNET_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -6090,7 +5778,6 @@ fn test_get_liquidity_position_id_matches_provide_initial_liquidity() { MAINNET_TWAMM_EXTENSION_ADDRESS, MAINNET_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, @@ -6136,7 +5823,6 @@ fn mock_simple_flow() { MOCK_TWAMM_EXTENSION_ADDRESS, MOCK_REGISTRY_ADDRESS, EKUBO_ORACLE_MAINNET, - MOCK_VELORDS_ADDRESS, ISSUANCE_REDUCTION_PRICE_X128, ISSUANCE_REDUCTION_PRICE_DURATION, ISSUANCE_REDUCTION_BIPS, From ea3d317e01625b79ea32f7064328be98a7edbe5b Mon Sep 17 00:00:00 2001 From: loothero <100039621+loothero@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:17:33 -0500 Subject: [PATCH 4/7] Update src/contract.cairo Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/contract.cairo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contract.cairo b/src/contract.cairo index a6bf910..63aa39a 100644 --- a/src/contract.cairo +++ b/src/contract.cairo @@ -181,7 +181,7 @@ pub mod TicketMaster { _register_token(ref self); // Store tokens remaining for distribution - self.tokens_for_distribution.write(total_supply.into()); + self.tokens_for_distribution.write((total_supply - ERC20_UNIT).into()); } #[abi(embed_v0)] From bd17890eacd72af61df123efa5f470d6c00cecf0 Mon Sep 17 00:00:00 2001 From: loothero Date: Thu, 4 Dec 2025 10:21:56 -0800 Subject: [PATCH 5/7] scarb fmt --- src/contract.cairo | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/contract.cairo b/src/contract.cairo index 63aa39a..9b72674 100644 --- a/src/contract.cairo +++ b/src/contract.cairo @@ -354,15 +354,12 @@ pub mod TicketMaster { // use all proceeds to buy back the reward token via DCA // start by moving the proceeds to positions contract let positions_dispatcher = self.positions_dispatcher.read(); - payment_token_dispatcher - .transfer(positions_dispatcher.contract_address, proceeds); + payment_token_dispatcher.transfer(positions_dispatcher.contract_address, proceeds); let position_token_id = self.position_token_id.read(); let order_key = _get_buyback_order_key(@self, 0, end_time); let sale_rate_increase = positions_dispatcher - .increase_sell_amount( - position_token_id, order_key, proceeds.try_into().unwrap(), - ); + .increase_sell_amount(position_token_id, order_key, proceeds.try_into().unwrap()); // Update the rewards distribution rate let previous_sale_rate = self.buyback_rate.read(); From 08867492e2efe356ff7002dea4fb22180f8d2165 Mon Sep 17 00:00:00 2001 From: loothero <100039621+loothero@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:24:10 -0500 Subject: [PATCH 6/7] Update scripts/deploy.sh Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- scripts/deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 7125fee..06b7078 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -290,7 +290,7 @@ if [[ "$INITIAL_PAYMENT_TOKEN_LIQUIDITY" =~ ^0+$ ]] || [[ "$INITIAL_DUNGEON_TICK exit 1 fi -TARGET_CLASS="/workspace/ticket-master/target/release/ticket_master_TicketMaster.contract_class.json" +TARGET_CLASS="target/release/ticket_master_TicketMaster.contract_class.json" print_info "Building package" scarb --release build if [ ! -f "$TARGET_CLASS" ]; then From f77e7b486fef5e4e87dbf8664741af2c107d7eb9 Mon Sep 17 00:00:00 2001 From: loothero Date: Thu, 4 Dec 2025 11:12:14 -0800 Subject: [PATCH 7/7] fix: account for registry token deduction in tokens_for_distribution tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The constructor now deducts ERC20_UNIT from tokens_for_distribution for the registry token registration. Update tests to reflect this: - constructor_sets_initial_state: include registry_token_amount in expected - get_tokens_for_distribution_returns_initial_value: subtract registry token - distribution_start_succeeds_with_minimal_tokens_for_distribution: subtract ERC20_UNIT 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- tests/test_contract.cairo | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index f402052..987394d 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -150,7 +150,9 @@ fn constructor_sets_initial_state() { "registry should receive single token", ); - let expected_tokens_for_distribution = DUNGEON_TICKET_SUPPLY.into() - premint_amount; + let expected_tokens_for_distribution = DUNGEON_TICKET_SUPPLY.into() + - premint_amount + - registry_token_amount; assert!( ticket_master_dispatcher.get_tokens_for_distribution() == expected_tokens_for_distribution, "tokens_for_distribution mismatch. Expected: {}, Actual: {}", @@ -4935,6 +4937,7 @@ fn get_oracle_address_returns_configured_address() { #[test] fn get_tokens_for_distribution_returns_initial_value() { start_mock_call(MOCK_REGISTRY_ADDRESS, selector!("register_token"), 0); + let registry_token_amount: u256 = 1000000000000000000_u128.into(); let (ticket_master_dispatcher, _, _) = setup( MOCK_CORE_ADDRESS, @@ -4950,9 +4953,16 @@ fn get_tokens_for_distribution_returns_initial_value() { ); let tokens = ticket_master_dispatcher.get_tokens_for_distribution(); + // Should be total supply (registry token not deducted from tokens_for_distribution) - let expected = DUNGEON_TICKET_SUPPLY.into(); - assert_eq!(tokens, expected, "Tokens for distribution should match"); + let expected = DUNGEON_TICKET_SUPPLY.into() - registry_token_amount; + assert_eq!( + tokens, + expected, + "Tokens for distribution should match. Expected: {}, Actual: {}", + expected, + tokens, + ); } // ================================ @@ -5515,8 +5525,11 @@ fn distribution_start_succeeds_with_minimal_tokens_for_distribution() { start_cheat_caller_address(ticket_master_dispatcher.contract_address, DEPLOYER_ADDRESS); let recipient: ContractAddress = 'tiny_recipient'.try_into().unwrap(); let minimal_distribution = 10_000_000_000_000_000_u128; - // Registry token is no longer deducted from tokens_for_distribution - let recipient_amount = total_supply - INITIAL_LIQUIDITY_DUNGEON_TICKETS - minimal_distribution; + // Registry token (ERC20_UNIT) is deducted from tokens_for_distribution + let recipient_amount = total_supply + - INITIAL_LIQUIDITY_DUNGEON_TICKETS + - minimal_distribution + - ERC20_UNIT; ticket_master_dispatcher.premint_tokens(array![recipient], array![recipient_amount.into()]); stop_cheat_caller_address(ticket_master_dispatcher.contract_address);