From 4dd0fc7e47bdbf239290009455ef5bd46b6b8f7c Mon Sep 17 00:00:00 2001 From: Nagaprasadvr <nagaprasadvr246@gmail.com> Date: Thu, 21 Nov 2024 17:36:06 +0530 Subject: [PATCH] resolve comments --- Cargo.lock | 1 - digital_asset_types/Cargo.toml | 1 - digital_asset_types/src/dao/scopes/asset.rs | 13 +++++------- .../src/token_metadata/master_edition.rs | 17 ++++++++++++--- .../src/token_metadata/mod.rs | 21 ++++++++++++++++++- .../src/token_metadata/v1_asset.rs | 18 +++------------- 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fdf217a4..0638677e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1942,7 +1942,6 @@ dependencies = [ "borsh-derive 0.10.3", "bs58 0.4.0", "futures", - "hex", "indexmap 1.9.3", "jsonpath_lib", "log", diff --git a/digital_asset_types/Cargo.toml b/digital_asset_types/Cargo.toml index 5eafabe57..53d7bc0d5 100644 --- a/digital_asset_types/Cargo.toml +++ b/digital_asset_types/Cargo.toml @@ -30,7 +30,6 @@ thiserror = { workspace = true } tokio = { workspace = true, features = ["macros"] } url = { workspace = true } mpl-token-metadata = { workspace = true } -hex = { workspace = true } [features] default = ["json_types", "sql_types"] diff --git a/digital_asset_types/src/dao/scopes/asset.rs b/digital_asset_types/src/dao/scopes/asset.rs index 203206ac7..5bbbddb01 100644 --- a/digital_asset_types/src/dao/scopes/asset.rs +++ b/digital_asset_types/src/dao/scopes/asset.rs @@ -15,6 +15,7 @@ use crate::{ use indexmap::IndexMap; use mpl_token_metadata::accounts::{Edition, MasterEdition}; use sea_orm::{entity::*, query::*, sea_query::Expr, ConnectionTrait, DbErr, Order}; +use serde::de::DeserializeOwned; use serde_json::Value; use solana_sdk::pubkey::Pubkey; use std::collections::HashMap; @@ -561,11 +562,7 @@ fn filter_out_stale_creators(creators: &mut Vec<asset_creators::Model>) { } } -pub fn get_edition_data_from_json(data: Value) -> Result<Edition, DbErr> { - serde_json::from_value(data).map_err(|e| DbErr::Custom(e.to_string())) -} - -pub fn get_master_edition_data_from_json(data: Value) -> Result<MasterEdition, DbErr> { +pub fn get_edition_data_from_json<T: DeserializeOwned>(data: Value) -> Result<T, DbErr> { serde_json::from_value(data).map_err(|e| DbErr::Custom(e.to_string())) } @@ -587,13 +584,13 @@ pub async fn get_nft_editions( let limit = limit.unwrap_or(10); - let master_edition_data = master_edition + let master_edition_data: MasterEdition = master_edition .data .clone() .ok_or(DbErr::RecordNotFound( "Master Edition data not found".to_string(), )) - .map(get_master_edition_data_from_json)??; + .map(get_edition_data_from_json)??; let nft_editions = asset_v1_account_attachments::Entity::find() .filter( @@ -612,7 +609,7 @@ pub async fn get_nft_editions( let nft_editions = nft_editions .iter() .map(|e| -> Result<NftEdition, DbErr> { - let data = e + let data: Edition = e .data .clone() .ok_or(DbErr::RecordNotFound("Edition data not found".to_string())) diff --git a/program_transformers/src/token_metadata/master_edition.rs b/program_transformers/src/token_metadata/master_edition.rs index 7dfb2c4df..73eeb1fcc 100644 --- a/program_transformers/src/token_metadata/master_edition.rs +++ b/program_transformers/src/token_metadata/master_edition.rs @@ -75,7 +75,7 @@ pub async fn save_master_edition( ..Default::default() }; - let query = asset_v1_account_attachments::Entity::insert(model) + let mut query = asset_v1_account_attachments::Entity::insert(model) .on_conflict( OnConflict::columns([asset_v1_account_attachments::Column::Id]) .update_columns([ @@ -86,6 +86,12 @@ pub async fn save_master_edition( .to_owned(), ) .build(DbBackend::Postgres); + + query.sql = format!( + "{} WHERE excluded.slot_updated >= asset_v1_account_attachments.slot_updated", + query.sql + ); + txn.execute(query).await?; Ok(()) } @@ -109,7 +115,7 @@ pub async fn save_edition( ..Default::default() }; - let query = asset_v1_account_attachments::Entity::insert(model) + let mut query = asset_v1_account_attachments::Entity::insert(model) .on_conflict( OnConflict::columns([asset_v1_account_attachments::Column::Id]) .update_columns([ @@ -120,7 +126,12 @@ pub async fn save_edition( .to_owned(), ) .build(DbBackend::Postgres); - txn.execute(query).await?; + query.sql = format!( + "{} WHERE excluded.slot_updated >= asset_v1_account_attachments.slot_updated", + query.sql + ); + + txn.execute(query).await?; Ok(()) } diff --git a/program_transformers/src/token_metadata/mod.rs b/program_transformers/src/token_metadata/mod.rs index 00cc89efe..bf0710560 100644 --- a/program_transformers/src/token_metadata/mod.rs +++ b/program_transformers/src/token_metadata/mod.rs @@ -7,7 +7,10 @@ use { }, AccountInfo, DownloadMetadataNotifier, }, - blockbuster::programs::token_metadata::{TokenMetadataAccountData, TokenMetadataAccountState}, + blockbuster::{ + programs::token_metadata::{TokenMetadataAccountData, TokenMetadataAccountState}, + token_metadata::types::TokenStandard, + }, master_edition::save_edition, sea_orm::{DatabaseConnection, TransactionTrait}, }; @@ -59,3 +62,19 @@ pub async fn handle_token_metadata_account<'a, 'b>( _ => Err(ProgramTransformerError::NotImplemented), } } + +pub trait IsNonFungibeFromTokenStandard { + fn is_non_fungible(&self) -> bool; +} + +impl IsNonFungibeFromTokenStandard for TokenStandard { + fn is_non_fungible(&self) -> bool { + matches!( + self, + TokenStandard::NonFungible + | TokenStandard::NonFungibleEdition + | TokenStandard::ProgrammableNonFungible + | TokenStandard::ProgrammableNonFungibleEdition + ) + } +} diff --git a/program_transformers/src/token_metadata/v1_asset.rs b/program_transformers/src/token_metadata/v1_asset.rs index 504b701ac..74f00ceb7 100644 --- a/program_transformers/src/token_metadata/v1_asset.rs +++ b/program_transformers/src/token_metadata/v1_asset.rs @@ -1,4 +1,5 @@ use { + super::IsNonFungibeFromTokenStandard, crate::{ asset_upserts::{ upsert_assets_metadata_account_columns, upsert_assets_mint_account_columns, @@ -144,16 +145,6 @@ async fn index_token_account_data<T: ConnectionTrait + TransactionTrait>( Ok(()) } -const fn check_is_non_fungible_from_token_standard(token_standard: Option<TokenStandard>) -> bool { - matches!( - token_standard, - Some(TokenStandard::NonFungible) - | Some(TokenStandard::NonFungibleEdition) - | Some(TokenStandard::ProgrammableNonFungible) - | Some(TokenStandard::ProgrammableNonFungibleEdition) - ) -} - pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>( conn: &T, metadata: &Metadata, @@ -413,7 +404,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>( txn.commit().await?; // If the asset is a non-fungible token, then we need to insert to the asset_v1_account_attachments table - if check_is_non_fungible_from_token_standard(metadata.token_standard) { + if let Some(true) = metadata.token_standard.map(|t| t.is_non_fungible()) { upsert_asset_v1_account_attachments(conn, &mint_pubkey, slot).await?; } @@ -446,10 +437,7 @@ async fn upsert_asset_v1_account_attachments<T: ConnectionTrait + TransactionTra let query = asset_v1_account_attachments::Entity::insert(attachment) .on_conflict( OnConflict::columns([asset_v1_account_attachments::Column::Id]) - .update_columns([ - asset_v1_account_attachments::Column::SlotUpdated, - asset_v1_account_attachments::Column::AssetId, - ]) + .update_columns([asset_v1_account_attachments::Column::AssetId]) .to_owned(), ) .build(DbBackend::Postgres);