Skip to content

Commit c3b502c

Browse files
committed
fix: role check
1 parent 99f294b commit c3b502c

2 files changed

Lines changed: 56 additions & 38 deletions

File tree

modules/vaults/components/permissioned-submit-button.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ export const MultiplePermissionedSubmitButton = forwardRef<
3030
const missingRoles =
3131
data?.missingRoles.map((role) => vaultTexts.roles[role].title) ?? [];
3232

33+
// console.log({
34+
// disabled,
35+
// isAccountActive,
36+
// isLoading,
37+
// hasPermissions: data?.hasPermissions,
38+
// missingRoles,
39+
// dashboardRoles,
40+
// });
41+
3342
return (
3443
<ConnectWalletButton>
3544
<Button type="submit" disabled={shouldDisable} ref={ref} {...rest}>

modules/vaults/hooks/use-vault-permissions.ts

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { dashboardAbi } from 'abi/dashboard-abi';
1010

1111
import type { Address, Hash } from 'viem';
12-
import { useMemo } from 'react';
12+
import { useCallback, useMemo } from 'react';
1313

1414
// adds defaultAdmin and nodeOperatorManager roles to the list of roles
1515
// if any roles are admined by them
@@ -77,48 +77,57 @@ export const useVaultPermissions = (roles: readonly VAULTS_ALL_ROLES[]) => {
7777
};
7878
}, [activeVault?.owner, address, roles]);
7979

80+
// stabilized select function to avoid unnecessary re-renders
81+
const selectFn = useCallback(
82+
(queryData: boolean[]) => {
83+
const data = [...queryData];
84+
85+
// Remove optional first service elements from array
86+
let isAdmin = false;
87+
let isNOM = false;
88+
if (rolesOffset > 0) {
89+
isAdmin = !!data.shift();
90+
}
91+
if (rolesOffset > 1) {
92+
isNOM = !!data.shift();
93+
}
94+
95+
const rolesResult = data.map((item, index) => {
96+
const saturateRole = saturatedRoles[index + rolesOffset];
97+
isAdmin ||= saturateRole.role === 'defaultAdmin' && !!item;
98+
isNOM ||= saturateRole.role === 'nodeOperatorManager' && !!item;
99+
return {
100+
role: saturateRole.role,
101+
// user can have role if
102+
hasRole:
103+
// 1. roles is set directly
104+
!!item ||
105+
// 2. user is admin over this role
106+
(saturateRole.isAdminRole && isAdmin) ||
107+
(saturateRole.isNOMRole && isNOM),
108+
};
109+
});
110+
111+
return {
112+
result: rolesResult,
113+
hasPermissions: rolesResult.every((item) => item.hasRole),
114+
hasDefaultAdminsPermissions: isAdmin,
115+
hasNodeOperatorPermissions: isNOM,
116+
missingRoles: rolesResult
117+
.filter((item) => !item.hasRole)
118+
.map((item) => item.role),
119+
};
120+
},
121+
[rolesOffset, saturatedRoles],
122+
);
123+
80124
const query = useReadContracts({
81125
contracts,
82126
allowFailure: false,
83127
batchSize: 5,
84128
query: {
85-
select: (data) => {
86-
// Remove optional first service elements from array
87-
let isAdmin = false;
88-
let isNOM = false;
89-
if (rolesOffset > 0) {
90-
isAdmin = !!data.shift();
91-
}
92-
if (rolesOffset > 1) {
93-
isNOM = !!data.shift();
94-
}
95-
96-
const rolesResult = data.map((item, index) => {
97-
const saturateRole = saturatedRoles[index];
98-
isAdmin ||= saturateRole.role === 'defaultAdmin' && !!item;
99-
isNOM ||= saturateRole.role === 'nodeOperatorManager' && !!item;
100-
return {
101-
role: saturateRole.role,
102-
// user can have role if
103-
hasRole:
104-
// 1. roles is set directly
105-
!!item ||
106-
// 2. user is admin over this role
107-
(saturateRole.isAdminRole && isAdmin) ||
108-
(saturateRole.isNOMRole && isNOM),
109-
};
110-
});
111-
112-
return {
113-
result: rolesResult,
114-
hasPermissions: rolesResult.every((item) => item.hasRole),
115-
hasDefaultAdminsPermissions: isAdmin,
116-
hasNodeOperatorPermissions: isNOM,
117-
missingRoles: rolesResult
118-
.filter((item) => !item.hasRole)
119-
.map((item) => item.role),
120-
};
121-
},
129+
select: selectFn,
130+
enabled: Boolean(activeVault?.owner && address && roles.length > 0),
122131
},
123132
});
124133

0 commit comments

Comments
 (0)