From 63256db7ba6f2bd1c5fbc901e0bc141e0f5d2e76 Mon Sep 17 00:00:00 2001 From: Kien Ngo Date: Wed, 18 Oct 2023 19:32:58 -0400 Subject: [PATCH 1/2] Add changeset --- .changeset/clever-buttons-bake.md | 5 ++ .../src/evm/core/classes/contract-roles.ts | 57 ++++++++++--------- 2 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 .changeset/clever-buttons-bake.md diff --git a/.changeset/clever-buttons-bake.md b/.changeset/clever-buttons-bake.md new file mode 100644 index 00000000000..52971cae706 --- /dev/null +++ b/.changeset/clever-buttons-bake.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/sdk": patch +--- + +Improve performance for contract-roles methods diff --git a/packages/sdk/src/evm/core/classes/contract-roles.ts b/packages/sdk/src/evm/core/classes/contract-roles.ts index d485a7c6e36..bce7af3fb90 100644 --- a/packages/sdk/src/evm/core/classes/contract-roles.ts +++ b/packages/sdk/src/evm/core/classes/contract-roles.ts @@ -68,9 +68,10 @@ export class ContractRoles public async getAll(): Promise> { invariant(this.roles.length, "this contract has no support for roles"); const roles = {} as Record; - for (const role of this.roles) { - roles[role] = await this.get(role); - } + const entries = Object.entries(this.roles); + (await Promise.all(entries.map(([str, role]) => this.get(role)))).forEach( + (item, index) => (roles[entries[index][1]] = item), + ); return roles; } @@ -151,17 +152,18 @@ export class ContractRoles const sortedRoles = roles.sort((role) => (role === "admin" ? 1 : -1)); for (let i = 0; i < sortedRoles.length; i++) { const role = sortedRoles[i]; - const addresses: Address[] = await Promise.all( - rolesWithAddresses[role]?.map( - async (addressOrEns) => await resolveAddress(addressOrEns), - ) || [], - ); - const currentAddresses: Address[] = await Promise.all( - currentRoles[role]?.map( - async (addressOrEns) => - await resolveAddress(addressOrEns as AddressOrEns), - ) || [], - ); + const [addresses, currentAddresses] = await Promise.all([ + Promise.all( + rolesWithAddresses[role]?.map((addressOrEns) => + resolveAddress(addressOrEns), + ) || [], + ), + Promise.all( + currentRoles[role]?.map((addressOrEns) => + resolveAddress(addressOrEns as AddressOrEns), + ) || [], + ), + ]); const toAdd = addresses.filter( (address) => !currentAddresses.includes(address), ); @@ -176,18 +178,17 @@ export class ContractRoles }); } if (toRemove.length) { - for (let j = 0; j < toRemove.length; j++) { - const address = toRemove[j]; - const revokeFunctionName = (await this.getRevokeRoleFunctionName( - address, - )) as any; + const revokeFunctionNames = await Promise.all( + toRemove.map((address) => this.getRevokeRoleFunctionName(address)), + ); + revokeFunctionNames.forEach((revokeFunctionName, index) => encoded.push( contractEncoder.encode(revokeFunctionName, [ getRoleHash(role), - address, + toRemove[index], ]), - ); - } + ), + ); } } @@ -211,8 +212,10 @@ export class ContractRoles public async verify(roles: TRole[], address: AddressOrEns): Promise { await Promise.all( roles.map(async (role) => { - const members = await this.get(role); - const resolvedAddress: Address = await resolveAddress(address); + const [members, resolvedAddress] = await Promise.all([ + this.get(role), + resolveAddress(address), + ]); if ( !members .map((a) => a.toLowerCase()) @@ -310,8 +313,10 @@ export class ContractRoles ****************************/ private async getRevokeRoleFunctionName(address: AddressOrEns) { - const resolvedAddress = await resolveAddress(address); - const signerAddress = await this.contractWrapper.getSignerAddress(); + const [resolvedAddress, signerAddress] = await Promise.all([ + resolveAddress(address), + this.contractWrapper.getSignerAddress(), + ]); if (signerAddress.toLowerCase() === resolvedAddress.toLowerCase()) { return "renounceRole"; } From e077687fae1983e578b91a27e3ca64f591f4fbbd Mon Sep 17 00:00:00 2001 From: Kien Ngo Date: Wed, 18 Oct 2023 19:38:44 -0400 Subject: [PATCH 2/2] Fix lint --- packages/sdk/src/evm/core/classes/contract-roles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/evm/core/classes/contract-roles.ts b/packages/sdk/src/evm/core/classes/contract-roles.ts index bce7af3fb90..9a9880001de 100644 --- a/packages/sdk/src/evm/core/classes/contract-roles.ts +++ b/packages/sdk/src/evm/core/classes/contract-roles.ts @@ -69,7 +69,7 @@ export class ContractRoles invariant(this.roles.length, "this contract has no support for roles"); const roles = {} as Record; const entries = Object.entries(this.roles); - (await Promise.all(entries.map(([str, role]) => this.get(role)))).forEach( + (await Promise.all(entries.map(([, role]) => this.get(role)))).forEach( (item, index) => (roles[entries[index][1]] = item), ); return roles;