@@ -44,6 +44,7 @@ contract BiPoolManagerTest is Test {
4444 event BucketsUpdated (bytes32 indexed exchangeId , uint256 bucket0 , uint256 bucket1 );
4545 event BreakerBoxUpdated (address newBreakerBox );
4646 event PricingModulesUpdated (bytes32 [] newIdentifiers , address [] newAddresses );
47+ event SpreadUpdated (bytes32 indexed exchangeId , uint256 spread );
4748
4849 /* ------------------------------------------- */
4950
@@ -357,6 +358,79 @@ contract BiPoolManagerTest_initilizerSettersGetters is BiPoolManagerTest {
357358 biPoolManager.setPricingModules (newIdentifiers, newPricingModules);
358359 }
359360
361+ function test_setSpread_whenSenderIsNotOwner_shouldRevert () public {
362+ changePrank (notDeployer);
363+ vm.expectRevert ("Ownable: caller is not the owner " );
364+ biPoolManager.setSpread (0x0 , 0 );
365+ }
366+
367+ function test_setSpread_whenExchangeDoesNotExist_shouldRevert () public {
368+ vm.expectRevert ("invalid exchangeId " );
369+ biPoolManager.setSpread (0x0 , 0.1 * 1e24 );
370+ }
371+
372+ function test_setSpread_whenSpreadIsGreaterThanOne_shouldRevert () public {
373+ mockOracleRate (address (cUSD), 1e24 );
374+ bytes32 exchangeId = createExchange (cUSD, bridgedUSDC);
375+ vm.expectRevert ("spread must be <= 1 " );
376+ biPoolManager.setSpread (exchangeId, 1e24 + 1 );
377+ }
378+
379+ function test_setSpread_whenCallerIsOwner_shouldUpdateAndEmit () public {
380+ mockOracleRate (address (cUSD), 1e24 );
381+ createExchange (cUSD, bridgedUSDC);
382+
383+ bytes32 exchangeId = keccak256 (abi.encodePacked (cUSD.symbol (), bridgedUSDC.symbol (), constantProduct.name ()));
384+ FixidityLib.Fraction memory currentSpread = biPoolManager.getPoolExchange (exchangeId).config.spread;
385+ require (FixidityLib.equals (currentSpread, FixidityLib.wrap (0.1 * 1e24 )), "Current spread is not 0.1 " );
386+
387+ vm.expectEmit (true , true , true , true );
388+ emit SpreadUpdated (exchangeId, 0.5 * 1e24 );
389+ biPoolManager.setSpread (exchangeId, 0.5 * 1e24 );
390+
391+ FixidityLib.Fraction memory newSpread = biPoolManager.getPoolExchange (exchangeId).config.spread;
392+ require (FixidityLib.equals (newSpread, FixidityLib.wrap (0.5 * 1e24 )), "New spread is not 0.5 " );
393+ }
394+
395+ function test_setSpread_whenSpreadIsZero_shouldUpdate () public {
396+ mockOracleRate (address (cUSD), 1e24 );
397+ bytes32 exchangeId = createExchange (cUSD, bridgedUSDC);
398+
399+ vm.expectEmit (true , true , true , true );
400+ emit SpreadUpdated (exchangeId, 0 );
401+ biPoolManager.setSpread (exchangeId, 0 );
402+
403+ FixidityLib.Fraction memory newSpread = biPoolManager.getPoolExchange (exchangeId).config.spread;
404+ require (FixidityLib.equals (newSpread, FixidityLib.wrap (0 )), "Spread should be 0 " );
405+ }
406+
407+ function test_setSpread_whenSpreadIsExactlyOne_shouldUpdate () public {
408+ mockOracleRate (address (cUSD), 1e24 );
409+ bytes32 exchangeId = createExchange (cUSD, bridgedUSDC);
410+
411+ vm.expectEmit (true , true , true , true );
412+ emit SpreadUpdated (exchangeId, 1e24 );
413+ biPoolManager.setSpread (exchangeId, 1e24 );
414+
415+ FixidityLib.Fraction memory newSpread = biPoolManager.getPoolExchange (exchangeId).config.spread;
416+ require (FixidityLib.equals (newSpread, FixidityLib.wrap (1e24 )), "Spread should be 1 " );
417+ }
418+
419+ function test_setSpread_whenSettingSameSpread_shouldEmitAndSucceed () public {
420+ mockOracleRate (address (cUSD), 1e24 );
421+ bytes32 exchangeId = createExchange (cUSD, bridgedUSDC);
422+
423+ // Initial spread is 0.1 * 1e24 from createExchange
424+ uint256 currentSpreadValue = 0.1 * 1e24 ;
425+
426+ vm.expectEmit (true , true , true , true );
427+ emit SpreadUpdated (exchangeId, currentSpreadValue);
428+ biPoolManager.setSpread (exchangeId, currentSpreadValue);
429+
430+ FixidityLib.Fraction memory newSpread = biPoolManager.getPoolExchange (exchangeId).config.spread;
431+ require (FixidityLib.equals (newSpread, FixidityLib.wrap (currentSpreadValue)), "Spread should remain 0.1 " );
432+ }
433+
360434 /* ---------- Getters ---------- */
361435
362436 function test_getPoolExchange_whenExchangeDoesNotExist_shouldRevert () public {
0 commit comments