Skip to content

Commit 38e86c0

Browse files
kien-ngoIDubuque
authored andcommitted
[SDK] Improve contract-roles methods (#1798)
1 parent 3e82cef commit 38e86c0

File tree

2 files changed

+36
-26
lines changed

2 files changed

+36
-26
lines changed

.changeset/clever-buttons-bake.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@thirdweb-dev/sdk": patch
3+
---
4+
5+
Improve performance for contract-roles methods

packages/sdk/src/evm/core/classes/contract-roles.ts

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ export class ContractRoles<TContract extends IPermissions, TRole extends Role>
6868
public async getAll(): Promise<Record<TRole, string[]>> {
6969
invariant(this.roles.length, "this contract has no support for roles");
7070
const roles = {} as Record<TRole, string[]>;
71-
for (const role of this.roles) {
72-
roles[role] = await this.get(role);
73-
}
71+
const entries = Object.entries(this.roles);
72+
(await Promise.all(entries.map(([, role]) => this.get(role)))).forEach(
73+
(item, index) => (roles[entries[index][1]] = item),
74+
);
7475
return roles;
7576
}
7677

@@ -151,17 +152,18 @@ export class ContractRoles<TContract extends IPermissions, TRole extends Role>
151152
const sortedRoles = roles.sort((role) => (role === "admin" ? 1 : -1));
152153
for (let i = 0; i < sortedRoles.length; i++) {
153154
const role = sortedRoles[i];
154-
const addresses: Address[] = await Promise.all(
155-
rolesWithAddresses[role]?.map(
156-
async (addressOrEns) => await resolveAddress(addressOrEns),
157-
) || [],
158-
);
159-
const currentAddresses: Address[] = await Promise.all(
160-
currentRoles[role]?.map(
161-
async (addressOrEns) =>
162-
await resolveAddress(addressOrEns as AddressOrEns),
163-
) || [],
164-
);
155+
const [addresses, currentAddresses] = await Promise.all([
156+
Promise.all(
157+
rolesWithAddresses[role]?.map((addressOrEns) =>
158+
resolveAddress(addressOrEns),
159+
) || [],
160+
),
161+
Promise.all(
162+
currentRoles[role]?.map((addressOrEns) =>
163+
resolveAddress(addressOrEns as AddressOrEns),
164+
) || [],
165+
),
166+
]);
165167
const toAdd = addresses.filter(
166168
(address) => !currentAddresses.includes(address),
167169
);
@@ -176,18 +178,17 @@ export class ContractRoles<TContract extends IPermissions, TRole extends Role>
176178
});
177179
}
178180
if (toRemove.length) {
179-
for (let j = 0; j < toRemove.length; j++) {
180-
const address = toRemove[j];
181-
const revokeFunctionName = (await this.getRevokeRoleFunctionName(
182-
address,
183-
)) as any;
181+
const revokeFunctionNames = await Promise.all(
182+
toRemove.map((address) => this.getRevokeRoleFunctionName(address)),
183+
);
184+
revokeFunctionNames.forEach((revokeFunctionName, index) =>
184185
encoded.push(
185186
contractEncoder.encode(revokeFunctionName, [
186187
getRoleHash(role),
187-
address,
188+
toRemove[index],
188189
]),
189-
);
190-
}
190+
),
191+
);
191192
}
192193
}
193194

@@ -211,8 +212,10 @@ export class ContractRoles<TContract extends IPermissions, TRole extends Role>
211212
public async verify(roles: TRole[], address: AddressOrEns): Promise<void> {
212213
await Promise.all(
213214
roles.map(async (role) => {
214-
const members = await this.get(role);
215-
const resolvedAddress: Address = await resolveAddress(address);
215+
const [members, resolvedAddress] = await Promise.all([
216+
this.get(role),
217+
resolveAddress(address),
218+
]);
216219
if (
217220
!members
218221
.map((a) => a.toLowerCase())
@@ -310,8 +313,10 @@ export class ContractRoles<TContract extends IPermissions, TRole extends Role>
310313
****************************/
311314

312315
private async getRevokeRoleFunctionName(address: AddressOrEns) {
313-
const resolvedAddress = await resolveAddress(address);
314-
const signerAddress = await this.contractWrapper.getSignerAddress();
316+
const [resolvedAddress, signerAddress] = await Promise.all([
317+
resolveAddress(address),
318+
this.contractWrapper.getSignerAddress(),
319+
]);
315320
if (signerAddress.toLowerCase() === resolvedAddress.toLowerCase()) {
316321
return "renounceRole";
317322
}

0 commit comments

Comments
 (0)