Skip to content

Commit b2c3601

Browse files
[hebaov2] Add resetGuardians method in SmartWallet (#2400)
* [hebaov2] Add resetGuardians method in SmartWallet * fix feedback
1 parent 1ff1c8c commit b2c3601

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

packages/hebao_v2/contracts/base/SmartWallet.sol

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,24 @@ contract SmartWallet is ERC1271
215215
wallet.removeGuardianWA(DOMAIN_SEPARATOR, approval, guardian);
216216
}
217217

218+
function resetGuardians(
219+
address[] calldata newGuardians
220+
)
221+
external
222+
onlyFromWalletOrOwnerWhenUnlocked
223+
{
224+
wallet.resetGuardians(newGuardians);
225+
}
226+
227+
function resetGuardiansWA(
228+
Approval calldata approval,
229+
address[] calldata newGuardians
230+
)
231+
external
232+
{
233+
wallet.resetGuardiansWA(DOMAIN_SEPARATOR, approval, newGuardians);
234+
}
235+
218236
function isGuardian(address addr, bool includePendingAddition)
219237
public
220238
view

packages/hebao_v2/contracts/base/libwallet/GuardianLib.sol

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)