11// SPDX-License-Identifier: Apache-2.0 OR MIT
22pragma solidity ^ 0.8.36 ;
33
4- import {SafeProxy} from "@safe/proxies/SafeProxy.sol " ;
5-
64import {USR_FORBIDDEN, USR_ILLEGAL_ARGUMENT, USR_NOT_FOUND} from "fvm-solidity/FVMErrors.sol " ;
75
6+ import {MockMultisig} from "./mocks/MockMultisig.sol " ;
87import {MockRewardTest} from "./mocks/MockRewardTest.sol " ;
98import {WAD} from "./mocks/FVMRewardActor.sol " ;
109import {StreamWeightActor} from "../src/StreamWeightActor.sol " ;
1110import {IServiceRewardsActor} from "../src/interfaces/IServiceRewardsActor.sol " ;
1211import {PendingOp, Share, WeightRecord, WeightRecordUpdate} from "../src/lib/FVMRewardTypes.sol " ;
1312import {Epoch} from "../src/lib/Epoch.sol " ;
1413import {FVMRewards} from "../src/lib/FVMRewards.sol " ;
14+ import {IsAMultisig} from "../src/lib/IsAMultisig.sol " ;
1515import {SWA_TIMELOCK} from "../src/lib/FVMRewardMethod.sol " ;
1616
1717contract StreamWeightActorTest is MockRewardTest {
@@ -27,8 +27,8 @@ contract StreamWeightActorTest is MockRewardTest {
2727
2828 function setUp () public override {
2929 super .setUp ();
30- owner1 = _makeSafeOwner ("owner1 " );
31- owner2 = _makeSafeOwner ("owner2 " );
30+ owner1 = _makeMultisigOwner ("owner1 " );
31+ owner2 = _makeMultisigOwner ("owner2 " );
3232
3333 address sra = makeAddr ("sra " );
3434 vm.mockCall (
@@ -40,16 +40,9 @@ contract StreamWeightActorTest is MockRewardTest {
4040 rewardActor ().mockSwa (address (actor));
4141 }
4242
43- function _makeSafeOwner (string memory label ) internal returns (address proxyAddr ) {
44- address masterCopy = makeAddr (string .concat (label, "-mastercopy " ));
45- vm.etch (masterCopy, new bytes (8001 ));
46-
47- SafeProxy real = new SafeProxy (masterCopy);
48- bytes memory code = address (real).code;
49-
50- proxyAddr = makeAddr (label);
51- vm.etch (proxyAddr, code);
52- vm.store (proxyAddr, bytes32 (0 ), bytes32 (uint256 (uint160 (masterCopy))));
43+ function _makeMultisigOwner (string memory label ) internal returns (address multisig ) {
44+ multisig = address (new MockMultisig (2 ));
45+ vm.label (multisig, label);
5346 }
5447
5548 // -------------------------------------------------------------------------
@@ -285,7 +278,7 @@ contract StreamWeightActorTest is MockRewardTest {
285278 // -------------------------------------------------------------------------
286279
287280 function test_ReplaceOwner_Success_SwapsApprovalRights () public {
288- address newOwner = _makeSafeOwner ("newOwner " );
281+ address newOwner = _makeMultisigOwner ("newOwner " );
289282
290283 vm.prank (owner1);
291284 actor.replaceOwner (owner2, newOwner);
@@ -301,4 +294,30 @@ contract StreamWeightActorTest is MockRewardTest {
301294 vm.prank (newOwner);
302295 actor.cancelPendingWeight (PendingOp.SET_WEIGHT);
303296 }
297+
298+ // -------------------------------------------------------------------------
299+ // Owner must be a multisig
300+ // -------------------------------------------------------------------------
301+
302+ function test_Constructor_EoaOwner_RevertsNotAMultisig () public {
303+ address eoa = makeAddr ("eoa " );
304+ vm.expectRevert (abi.encodeWithSelector (IsAMultisig.NotAMultisig.selector , eoa));
305+ new StreamWeightActor (owner1, eoa, IServiceRewardsActor (makeAddr ("sra " )));
306+ }
307+
308+ function test_Constructor_SingleSignerOwner_RevertsTooFewSigners () public {
309+ address solo = address (new MockMultisig (1 ));
310+ vm.expectRevert (abi.encodeWithSelector (IsAMultisig.TooFewSigners.selector , solo, uint256 (1 )));
311+ new StreamWeightActor (owner1, solo, IServiceRewardsActor (makeAddr ("sra " )));
312+ }
313+
314+ function test_ReplaceOwner_EoaOwner_RevertsNotAMultisig () public {
315+ address eoa = makeAddr ("eoa " );
316+
317+ vm.prank (owner1);
318+ actor.replaceOwner (owner2, eoa);
319+ vm.prank (owner2);
320+ vm.expectRevert (abi.encodeWithSelector (IsAMultisig.NotAMultisig.selector , eoa));
321+ actor.replaceOwner (owner2, eoa);
322+ }
304323}
0 commit comments