From bc97c0c678d7a8ed61630865dfde5b5d13f6cf1c Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Tue, 10 Aug 2021 08:17:36 -0500 Subject: [PATCH] Work in progress on speed fix --- .../web/src/contexts/meta/loadAccounts.ts | 53 ++++++++++++++++--- js/packages/web/src/models/metaplex/index.ts | 1 + rust/token-metadata/program/src/processor.rs | 3 ++ rust/token-metadata/program/src/utils.rs | 22 ++++++++ 4 files changed, 73 insertions(+), 6 deletions(-) diff --git a/js/packages/web/src/contexts/meta/loadAccounts.ts b/js/packages/web/src/contexts/meta/loadAccounts.ts index aca10cc..0f6e6be 100644 --- a/js/packages/web/src/contexts/meta/loadAccounts.ts +++ b/js/packages/web/src/contexts/meta/loadAccounts.ts @@ -11,7 +11,16 @@ import { processAuctions } from './processAuctions'; import { processMetaplexAccounts } from './processMetaplexAccounts'; import { processMetaData } from './processMetaData'; import { processVaultData } from './processVaultData'; -import { Metadata, ParsedAccount } from '../../../../common/dist/lib'; +import { + MAX_CREATOR_LEN, + MAX_CREATOR_LIMIT, + Metadata, + ParsedAccount, +} from '../../../../common/dist/lib'; +import { + MAX_WHITELISTED_CREATOR_SIZE, + MetaplexKey, +} from '../../models/metaplex'; export const loadAccounts = async (connection: Connection, all: boolean) => { const tempCache: MetaState = { @@ -47,16 +56,48 @@ export const loadAccounts = async (connection: Connection, all: boolean) => { } }; - await Promise.all([ + await connection + .getProgramAccounts(METAPLEX_ID, { + filters: [ + { + dataSize: MAX_WHITELISTED_CREATOR_SIZE, + }, + { + memcmp: { + offset: 0, + bytes: MetaplexKey.WhitelistedCreatorV1.toString(), + }, + }, + ], + }) + .then(forEach(processMetaplexAccounts)); + + const promises = [ connection.getProgramAccounts(VAULT_ID).then(forEach(processVaultData)), connection.getProgramAccounts(AUCTION_ID).then(forEach(processAuctions)), - connection - .getProgramAccounts(METADATA_PROGRAM_ID) - .then(forEach(processMetaData)), + , connection .getProgramAccounts(METAPLEX_ID) .then(forEach(processMetaplexAccounts)), - ]); + ]; + for (let i = 0; i < MAX_CREATOR_LIMIT; i++) { + promises.push( + connection + .getProgramAccounts(METADATA_PROGRAM_ID, { + filters: [ + { + memcmp: { + offset: 0, + bytes: MetaplexKey.WhitelistedCreatorV1.toString(), + }, + }, + ], + }) + .then(forEach(processMetaData)), + ); + } + + await Promise.all(promises); await postProcessMetadata(tempCache, all); diff --git a/js/packages/web/src/models/metaplex/index.ts b/js/packages/web/src/models/metaplex/index.ts index 34de25c..5869259 100644 --- a/js/packages/web/src/models/metaplex/index.ts +++ b/js/packages/web/src/models/metaplex/index.ts @@ -38,6 +38,7 @@ export const METAPLEX_PREFIX = 'metaplex'; export const TOTALS = 'totals'; export const ORIGINAL_AUTHORITY_LOOKUP_SIZE = 33; export const MAX_PRIZE_TRACKING_TICKET_SIZE = 1 + 32 + 8 + 8 + 8 + 50; +export const MAX_WHITELISTED_CREATOR_SIZE = 2 + 32 + 10; export enum MetaplexKey { Uninitialized = 0, OriginalAuthorityLookupV1 = 1, diff --git a/rust/token-metadata/program/src/processor.rs b/rust/token-metadata/program/src/processor.rs index 2abd665..656493e 100644 --- a/rust/token-metadata/program/src/processor.rs +++ b/rust/token-metadata/program/src/processor.rs @@ -20,6 +20,7 @@ use { create_or_allocate_account_raw, get_owner_from_token_account, process_create_metadata_accounts_logic, process_mint_new_edition_from_master_edition_via_token_logic, transfer_mint_authority, + puff_out_data_fields, CreateMetadataAccountsLogicArgs, MintNewEditionFromMasterEditionViaTokenLogicArgs, }, }, @@ -203,6 +204,8 @@ pub fn process_update_metadata_accounts( } } + puff_out_data_fields(&mut metadata); + metadata.serialize(&mut *metadata_account_info.data.borrow_mut())?; Ok(()) } diff --git a/rust/token-metadata/program/src/utils.rs b/rust/token-metadata/program/src/utils.rs index 7960e62..f3dde9e 100644 --- a/rust/token-metadata/program/src/utils.rs +++ b/rust/token-metadata/program/src/utils.rs @@ -850,10 +850,32 @@ pub fn process_create_metadata_accounts_logic( metadata.is_mutable = is_mutable; metadata.update_authority = *update_authority_info.key; + puff_out_data_fields(&mut metadata); metadata.serialize(&mut *metadata_account_info.data.borrow_mut())?; Ok(()) } + +pub fn puff_out_data_fields(metadata: &mut Metadata) { + let mut array_of_zeroes = vec![]; + while array_of_zeroes.len() < MAX_NAME_LENGTH - metadata.data.name.len() { + array_of_zeroes.push(0u8); + } + metadata.data.name = metadata.data.name.clone() + std::str::from_utf8(&array_of_zeroes).unwrap(); + + let mut array_of_zeroes = vec![]; + while array_of_zeroes.len() < MAX_SYMBOL_LENGTH - metadata.data.symbol.len() { + array_of_zeroes.push(0u8); + } + metadata.data.symbol = metadata.data.symbol.clone() + std::str::from_utf8(&array_of_zeroes).unwrap(); + + let mut array_of_zeroes = vec![]; + while array_of_zeroes.len() < MAX_URI_LENGTH - metadata.data.uri.len() { + array_of_zeroes.push(0u8); + } + metadata.data.uri = metadata.data.uri.clone() + std::str::from_utf8(&array_of_zeroes).unwrap(); +} + pub struct MintNewEditionFromMasterEditionViaTokenLogicArgs<'a> { pub new_metadata_account_info: &'a AccountInfo<'a>, pub new_edition_account_info: &'a AccountInfo<'a>,