From a5475abb0b9af2b4c201a0e4af9c560fd1f8aeee Mon Sep 17 00:00:00 2001 From: Vignesh Hirudayakanth Date: Sun, 10 Mar 2024 20:19:42 -0700 Subject: [PATCH] Use getLogs directly instead of creating a filter and querying it --- .changeset/great-dragons-cough.md | 6 +++ .../src/client/edition/schedules.ts | 45 ++++------------ packages/legacy-sdk/src/types.ts | 2 +- .../src/contract/edition-v1/read/actions.ts | 5 +- .../src/contract/edition-v1/read/schedules.ts | 51 ++++--------------- 5 files changed, 30 insertions(+), 79 deletions(-) create mode 100644 .changeset/great-dragons-cough.md diff --git a/.changeset/great-dragons-cough.md b/.changeset/great-dragons-cough.md new file mode 100644 index 00000000..c05051e9 --- /dev/null +++ b/.changeset/great-dragons-cough.md @@ -0,0 +1,6 @@ +--- +'@soundxyz/legacy-sdk': minor +'@soundxyz/sdk': minor +--- + +legacy sdk minter performance issue fix diff --git a/packages/legacy-sdk/src/client/edition/schedules.ts b/packages/legacy-sdk/src/client/edition/schedules.ts index b3c66ca9..ef1e5840 100644 --- a/packages/legacy-sdk/src/client/edition/schedules.ts +++ b/packages/legacy-sdk/src/client/edition/schedules.ts @@ -79,7 +79,7 @@ export async function editionScheduleIds( this: SoundClientInstance, { editionAddress, - fromBlock, + fromBlock = 'earliest', }: { editionAddress: Address fromBlock?: BlockOrBlockTag @@ -112,7 +112,7 @@ export async function editionRegisteredMinters( this: SoundClientInstance, { editionAddress, - fromBlock, + fromBlock = 'earliest', }: { editionAddress: Address fromBlock?: BlockOrBlockTag @@ -131,7 +131,7 @@ export async function editionRegisteredMinters( functionName: 'MINTER_ROLE', }) - const rolesUpdatedFilter = await client.createEventFilter({ + const roleEvents = await client.getLogs({ event: { anonymous: false, inputs: [ @@ -146,7 +146,7 @@ export async function editionRegisteredMinters( name: 'RolesUpdated', type: 'event', }, - fromBlock: fromBlock ?? 'earliest', + fromBlock, address: editionAddress, args: { roles: minterRole, @@ -154,17 +154,8 @@ export async function editionRegisteredMinters( strict: true, }) - const roleEvents = await client.getFilterLogs({ - filter: rolesUpdatedFilter, - }) - - const candidateMinters = Array.from( - roleEvents.reduce((acc, event) => { - if (event.args?.user) acc.add(event.args.user) - - return acc - }, new Set
()), - ) + // This list may contain duplicates if MINTER_ROLE was granted multiple times + const candidateMinters = [...new Set(roleEvents.map((event) => event.args.user))] // Check supportsInterface() to verify each address is a minter const minters = await Promise.all( @@ -183,13 +174,8 @@ export async function editionRegisteredMinters( } }), ) - // This list may contain duplicates if MINTER_ROLE was granted multiple times - const allMinters = minters.reduce((acc, minter) => { - if (minter) acc.add(minter) - return acc - }, new Set
()) - return Array.from(allMinters) + return minters.filter((minter): minter is Address => minter != null) } export async function editionMinterMintIds( @@ -197,7 +183,7 @@ export async function editionMinterMintIds( { editionAddress, minterAddress, - fromBlock, + fromBlock = 'earliest', }: { editionAddress: Address minterAddress: Address @@ -207,7 +193,7 @@ export async function editionMinterMintIds( const client = await this.expectClient() // Query MintConfigCreated event, for v1 and v2, this signature is the same - const filter = await client.createEventFilter({ + const mintScheduleConfigEvents = await client.getLogs({ address: minterAddress, event: { anonymous: false, @@ -252,23 +238,14 @@ export async function editionMinterMintIds( name: 'MintConfigCreated', type: 'event', }, - fromBlock: fromBlock ?? 'earliest', + fromBlock, args: { edition: editionAddress, }, strict: true, }) - const mintScheduleConfigEvents = await client.getFilterLogs({ - filter, - }) - - return Array.from( - mintScheduleConfigEvents.reduce((acc, event) => { - if (event.args?.mintId != null) acc.add(event.args.mintId) - return acc - }, new Set()), - ) + return [...new Set(mintScheduleConfigEvents.map((event) => event.args.mintId))] } /** diff --git a/packages/legacy-sdk/src/types.ts b/packages/legacy-sdk/src/types.ts index d79404ba..82b25ebe 100644 --- a/packages/legacy-sdk/src/types.ts +++ b/packages/legacy-sdk/src/types.ts @@ -18,7 +18,7 @@ type LazyOption = T | (() => T | Promise) export type ClientProvider = Pick< PublicClient, - 'chain' | 'readContract' | 'getFilterLogs' | 'createEventFilter' | 'estimateContractGas' | 'multicall' + 'chain' | 'readContract' | 'getLogs' | 'estimateContractGas' | 'multicall' > export type Wallet = Pick diff --git a/packages/sdk/src/contract/edition-v1/read/actions.ts b/packages/sdk/src/contract/edition-v1/read/actions.ts index c6b19f3e..c591723f 100644 --- a/packages/sdk/src/contract/edition-v1/read/actions.ts +++ b/packages/sdk/src/contract/edition-v1/read/actions.ts @@ -21,10 +21,7 @@ import { editionMintSchedules, editionMintSchedulesFromIds, editionScheduleIds } import type { MerkleProvider } from '../../../utils/types' export function editionV1PublicActions< - Client extends Pick< - PublicClient, - 'readContract' | 'multicall' | 'estimateContractGas' | 'createEventFilter' | 'getFilterLogs' - > & { + Client extends Pick & { editionV1?: { sam?: {} } diff --git a/packages/sdk/src/contract/edition-v1/read/schedules.ts b/packages/sdk/src/contract/edition-v1/read/schedules.ts index b09b669b..b79002ab 100644 --- a/packages/sdk/src/contract/edition-v1/read/schedules.ts +++ b/packages/sdk/src/contract/edition-v1/read/schedules.ts @@ -27,9 +27,7 @@ export function isHandledMinterInterfaceId(interfaceId: string): interfaceId is return HANDLED_MINTER_INTERFACE_IDS_SET.has(interfaceId) } -export async function editionRegisteredMinters< - Client extends Pick, ->( +export async function editionRegisteredMinters>( client: Client, { editionAddress, @@ -48,7 +46,7 @@ export async function editionRegisteredMinters< functionName: 'MINTER_ROLE', }) - const rolesUpdatedFilter = await client.createEventFilter({ + const roleEvents = await client.getLogs({ event: { anonymous: false, inputs: [ @@ -71,17 +69,8 @@ export async function editionRegisteredMinters< strict: true, }) - const roleEvents = await client.getFilterLogs({ - filter: rolesUpdatedFilter, - }) - - const candidateMinters = Array.from( - roleEvents.reduce((acc, event) => { - if (event.args?.user) acc.add(event.args.user) - - return acc - }, new Set
()), - ) + // This list may contain duplicates if MINTER_ROLE was granted multiple times + const candidateMinters = [...new Set(roleEvents.map((event) => event.args.user))] // Check supportsInterface() to verify each address is a minter const minters = await Promise.all( @@ -100,16 +89,11 @@ export async function editionRegisteredMinters< } }), ) - // This list may contain duplicates if MINTER_ROLE was granted multiple times - const allMinters = minters.reduce((acc, minter) => { - if (minter) acc.add(minter) - return acc - }, new Set
()) - return Array.from(allMinters) + return minters.filter((minter): minter is Address => minter != null) } -export async function editionMinterMintIds>( +export async function editionMinterMintIds>( client: Client, { editionAddress, @@ -121,8 +105,8 @@ export async function editionMinterMintIds { - if (event.args?.mintId != null) acc.add(event.args.mintId) - return acc - }, new Set()), - ) + return [...new Set(mintScheduleConfigEvents.map((event) => event.args.mintId))] } -export async function editionScheduleIds< - Client extends Pick, ->( +export async function editionScheduleIds>( client: Client, { editionAddress, @@ -575,9 +548,7 @@ export async function editionMintSchedulesFromIds, ->( +export async function editionMintSchedules>( client: Client, { editionAddress,