diff --git a/creator-keys/src/lib.rs b/creator-keys/src/lib.rs index 1944ad17..359be1fc 100644 --- a/creator-keys/src/lib.rs +++ b/creator-keys/src/lib.rs @@ -3352,7 +3352,7 @@ impl CreatorKeysContract { let max_allowed = ((i128::from(post_buy_supply) * i128::from(cap_bps)) / i128::from(fee::BPS_MAX)) as u32; if post_buy_balance > max_allowed { - return Err(ContractError::WalletCapExceeded); + return Err(ContractError::MaxHoldingExceeded); } } } @@ -5887,7 +5887,7 @@ impl CreatorKeysContract { creator.require_auth(); let resolved_bps = cap_bps.unwrap_or(DEFAULT_HOLDER_CAP_BPS); if !(HOLDER_CAP_MIN_BPS..=HOLDER_CAP_MAX_BPS).contains(&resolved_bps) { - return Err(ContractError::WalletCapExceeded); + return Err(ContractError::InvalidHolderCap); } let key = constants::storage::holder_cap_bps(&creator); env.storage().persistent().set(&key, &resolved_bps); diff --git a/creator-keys/src/test_issues.rs b/creator-keys/src/test_issues.rs index bc46f5f1..06dd66c7 100644 --- a/creator-keys/src/test_issues.rs +++ b/creator-keys/src/test_issues.rs @@ -282,6 +282,10 @@ mod issue_tests { client.buy_key(&creator, &buyer, &KEY_PRICE, &None); } + // Advance ledger so sells are in a different ledger from the last buy + // (required by the flash-loan guard). + env.ledger().with_mut(|l| l.sequence_number += 1); + assert_supply_equals_holder_sum( &env, &client, diff --git a/creator-keys/test_snapshots/test_issues/issue_tests/test_invariant_after_sell.1.json b/creator-keys/test_snapshots/test_issues/issue_tests/test_invariant_after_sell.1.json index bc54701e..c11e22ff 100644 --- a/creator-keys/test_snapshots/test_issues/issue_tests/test_invariant_after_sell.1.json +++ b/creator-keys/test_snapshots/test_issues/issue_tests/test_invariant_after_sell.1.json @@ -462,7 +462,7 @@ ], "ledger": { "protocol_version": 22, - "sequence_number": 1, + "sequence_number": 2, "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, @@ -645,13 +645,13 @@ }, "durability": "persistent", "val": { - "u32": 6311521 + "u32": 6311522 } } }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -750,7 +750,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -804,7 +804,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -855,7 +855,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -1229,7 +1229,7 @@ }, "ext": "v0" }, - 6312000 + 6312001 ] ], [ @@ -1295,7 +1295,7 @@ }, "ext": "v0" }, - 6312000 + 6312001 ] ], [ @@ -1493,7 +1493,7 @@ }, "ext": "v0" }, - 6312000 + 6312001 ] ], [ @@ -1526,7 +1526,7 @@ }, "ext": "v0" }, - 6312000 + 6312001 ] ], [ diff --git a/creator-keys/test_snapshots/test_sell_slippage_succeeds_when_proceeds_meet_or_exceed_min_proceeds.1.json b/creator-keys/test_snapshots/test_sell_slippage_succeeds_when_proceeds_meet_or_exceed_min_proceeds.1.json index 2edd917b..a4088673 100644 --- a/creator-keys/test_snapshots/test_sell_slippage_succeeds_when_proceeds_meet_or_exceed_min_proceeds.1.json +++ b/creator-keys/test_snapshots/test_sell_slippage_succeeds_when_proceeds_meet_or_exceed_min_proceeds.1.json @@ -1540,7 +1540,7 @@ "symbol": "ledger" }, "val": { - "u32": 0 + "u32": 2 } } ] diff --git a/creator-keys/test_snapshots/test_sell_succeeds_when_min_proceeds_equals_actual_proceeds.1.json b/creator-keys/test_snapshots/test_sell_succeeds_when_min_proceeds_equals_actual_proceeds.1.json index 589791c6..dbc1804e 100644 --- a/creator-keys/test_snapshots/test_sell_succeeds_when_min_proceeds_equals_actual_proceeds.1.json +++ b/creator-keys/test_snapshots/test_sell_succeeds_when_min_proceeds_equals_actual_proceeds.1.json @@ -1204,6 +1204,68 @@ ] }, "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "slp_ok" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "actual_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "bound" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "creator_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", diff --git a/creator-keys/test_snapshots/test_sell_updates_creator_supply_and_seller_balance_atomically.1.json b/creator-keys/test_snapshots/test_sell_updates_creator_supply_and_seller_balance_atomically.1.json index 562186f7..dec2a389 100644 --- a/creator-keys/test_snapshots/test_sell_updates_creator_supply_and_seller_balance_atomically.1.json +++ b/creator-keys/test_snapshots/test_sell_updates_creator_supply_and_seller_balance_atomically.1.json @@ -262,7 +262,7 @@ ], "ledger": { "protocol_version": 22, - "sequence_number": 1, + "sequence_number": 2, "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, @@ -493,7 +493,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -532,13 +532,13 @@ }, "durability": "persistent", "val": { - "u32": 6311521 + "u32": 6311522 } } }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -693,7 +693,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -747,7 +747,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -798,7 +798,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -1088,7 +1088,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -1130,7 +1130,7 @@ }, "ext": "v0" }, - 6311521 + 6311522 ] ], [ @@ -1393,7 +1393,7 @@ }, "ext": "v0" }, - 6312000 + 6312001 ] ], [ @@ -1426,7 +1426,7 @@ }, "ext": "v0" }, - 6312000 + 6312001 ] ], [ diff --git a/creator-keys/tests/global_emergency_pause.rs b/creator-keys/tests/global_emergency_pause.rs index de47e011..f3313f67 100644 --- a/creator-keys/tests/global_emergency_pause.rs +++ b/creator-keys/tests/global_emergency_pause.rs @@ -189,6 +189,14 @@ fn test_global_resume_with_two_approvals_lifts_halt() { let events = env.events().all(); assert!(!f.client.get_global_trading_paused()); + // Check the captured log: a view call above resets the harness's visible + // event buffer, so a fresh `env.events().all()` here would be empty. + assert!(events.iter().any(|(_, topics, _)| { + topics.get(0).map(|topic| { + let name: soroban_sdk::Symbol = topic.into_val(&env); + name == GLOBAL_PAUSE_LIFTED_EVENT_NAME + }) == Some(true) + })); let (_, data) = events .iter() .rev() diff --git a/creator-keys/tests/holder_cap.rs b/creator-keys/tests/holder_cap.rs index 57d5108f..e480837c 100644 --- a/creator-keys/tests/holder_cap.rs +++ b/creator-keys/tests/holder_cap.rs @@ -57,7 +57,7 @@ fn test_buy_pushing_holder_above_cap_panics() { let result = client.try_buy_key(&creator, &buyer, &KEY_PRICE, &None); assert_eq!( result, - Err(Ok(ContractError::WalletCapExceeded)), + Err(Ok(ContractError::MaxHoldingExceeded)), "a buy past 10% of supply must be rejected" ); assert_eq!(client.get_key_balance(&creator, &buyer), 2); @@ -118,10 +118,10 @@ fn test_set_holder_cap_rejects_values_outside_one_and_twenty_five_percent() { let (client, creator) = setup(&env); let too_small = client.try_set_holder_cap(&creator, &Some(99)); - assert_eq!(too_small, Err(Ok(ContractError::WalletCapExceeded))); + assert_eq!(too_small, Err(Ok(ContractError::InvalidHolderCap))); let too_large = client.try_set_holder_cap(&creator, &Some(2501)); - assert_eq!(too_large, Err(Ok(ContractError::WalletCapExceeded))); + assert_eq!(too_large, Err(Ok(ContractError::InvalidHolderCap))); assert_eq!(client.get_holder_cap(&creator), None); } diff --git a/creator-keys/tests/resolve_issues_tests.rs b/creator-keys/tests/resolve_issues_tests.rs index 828c7e5a..8b6494cf 100644 --- a/creator-keys/tests/resolve_issues_tests.rs +++ b/creator-keys/tests/resolve_issues_tests.rs @@ -275,6 +275,9 @@ fn test_sell_updates_creator_supply_and_seller_balance_atomically() { assert_eq!(client.get_total_key_supply(&creator), 3); assert_eq!(client.get_key_balance(&creator, &seller), 3); + // Advance the ledger so the sells are not blocked by the flash-loan guard. + env.ledger().with_mut(|l| l.sequence_number += 1); + // Execute a sell of 2 keys let mut l = env.ledger().get(); l.sequence_number += 1;