@@ -28,6 +28,9 @@ library GuardianLib
2828 bytes32 public constant REMOVE_GUARDIAN_TYPEHASH = keccak256 (
2929 "removeGuardian(address wallet,uint256 validUntil,address guardian) "
3030 );
31+ bytes32 public constant RESET_GUARDIANS_TYPEHASH = keccak256 (
32+ "resetGuardians(address wallet,uint256 validUntil,address[] guardians) "
33+ );
3134
3235 event GuardianAdded (address guardian , uint effectiveTime );
3336 event GuardianRemoved (address guardian , uint effectiveTime );
@@ -108,6 +111,48 @@ library GuardianLib
108111 _removeGuardian (wallet, guardian, 0 , true );
109112 }
110113
114+ function resetGuardians (
115+ Wallet storage wallet ,
116+ address [] calldata newGuardians
117+ )
118+ external
119+ {
120+ Guardian[] memory allGuardians = guardians (wallet, true );
121+ for (uint i = 0 ; i < allGuardians.length ; i++ ) {
122+ _removeGuardian (wallet, allGuardians[i].addr, GUARDIAN_PENDING_PERIOD, false );
123+ }
124+
125+ for (uint j = 0 ; j < newGuardians.length ; j++ ) {
126+ _addGuardian (wallet, newGuardians[j], GUARDIAN_PENDING_PERIOD, false );
127+ }
128+ }
129+
130+ function resetGuardiansWA (
131+ Wallet storage wallet ,
132+ bytes32 domainSeperator ,
133+ Approval calldata approval ,
134+ address [] calldata newGuardians
135+ )
136+ external
137+ {
138+ wallet.verifyApproval (
139+ domainSeperator,
140+ SigRequirement.MAJORITY_OWNER_REQUIRED,
141+ approval,
142+ abi.encode (
143+ RESET_GUARDIANS_TYPEHASH,
144+ approval.wallet,
145+ approval.validUntil,
146+ keccak256 (abi.encodePacked (newGuardians))
147+ )
148+ );
149+
150+ removeAllGuardians (wallet);
151+ for (uint i = 0 ; i < newGuardians.length ; i++ ) {
152+ _addGuardian (wallet, newGuardians[i], 0 , true );
153+ }
154+ }
155+
111156 function requireMajority (
112157 Wallet storage wallet ,
113158 address [] memory signers ,
0 commit comments