Skip to content

Commit

Permalink
fix mint address insertion to asset_v1_account_attachments table
Browse files Browse the repository at this point in the history
  • Loading branch information
Nagaprasadvr committed Nov 15, 2024
1 parent 12faa87 commit bf501bd
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 15 deletions.
17 changes: 2 additions & 15 deletions digital_asset_types/src/dao/scopes/asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::{
asset::{self},
asset_authority, asset_creators, asset_data, asset_grouping, asset_v1_account_attachments,
cl_audits_v2,
extensions::{self, asset_v1_account_attachment, instruction::PascalCase},
extensions::{self, instruction::PascalCase},
sea_orm_active_enums::{Instruction, V1AccountAttachments},
Cursor, FullAsset, GroupingSize, Pagination,
},
Expand Down Expand Up @@ -561,19 +561,6 @@ fn filter_out_stale_creators(creators: &mut Vec<asset_creators::Model>) {
}
}

fn derive_master_edition_pda_from_mint(mint: Pubkey) -> Pubkey {
let (pda, _bump_seed) = Pubkey::find_program_address(
&[
b"metadata",
mpl_token_metadata::programs::MPL_TOKEN_METADATA_ID.as_ref(),
mint.as_ref(),
b"edition",
],
&mpl_token_metadata::programs::MPL_TOKEN_METADATA_ID,
);
pda
}

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()))
}
Expand All @@ -588,7 +575,7 @@ pub async fn get_nft_editions(
limit: Option<u32>,
page: Option<u32>,
) -> Result<NftEditions, DbErr> {
let master_edition_pubkey = derive_master_edition_pda_from_mint(mint_address);
let master_edition_pubkey = MasterEdition::find_pda(&mint_address).0;

let master_edition =
asset_v1_account_attachments::Entity::find_by_id(master_edition_pubkey.to_bytes().to_vec())
Expand Down
45 changes: 45 additions & 0 deletions program_transformers/src/token_metadata/v1_asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ use {
ConnectionTrait, DbBackend, DbErr, TransactionTrait,
},
solana_sdk::pubkey,
solana_sdk::pubkey::Pubkey,
sqlx::types::Decimal,
tracing::warn,
};
Expand Down Expand Up @@ -143,6 +144,16 @@ async fn index_token_account_data<T: ConnectionTrait + TransactionTrait>(
Ok(())
}

fn check_is_non_fungible_from_token_standard(token_standard: &Option<TokenStandard>) -> bool {
match token_standard {
Some(TokenStandard::NonFungible)
| Some(TokenStandard::NonFungibleEdition)
| Some(TokenStandard::ProgrammableNonFungible)
| Some(TokenStandard::ProgrammableNonFungibleEdition) => true,
_ => false,
}
}

pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
conn: &T,
metadata: &Metadata,
Expand Down Expand Up @@ -401,6 +412,11 @@ 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) {
upsert_asset_v1_account_attachments(conn, &mint_pubkey, slot).await?;
}

if uri.is_empty() {
warn!(
"URI is empty for mint {}. Skipping background task.",
Expand All @@ -411,3 +427,32 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(

Ok(Some(DownloadMetadataInfo::new(mint_pubkey_vec, uri)))
}

async fn upsert_asset_v1_account_attachments<T: ConnectionTrait + TransactionTrait>(
conn: &T,
mint_pubkey: &Pubkey,
slot: u64,
) -> ProgramTransformerResult<()> {
let edition_pubkey = MasterEdition::find_pda(mint_pubkey).0;
let mint_pubkey_vec = mint_pubkey.to_bytes().to_vec();
let attachment = asset_v1_account_attachments::ActiveModel {
id: ActiveValue::Set(edition_pubkey.to_bytes().to_vec()),
asset_id: ActiveValue::Set(Some(mint_pubkey_vec.clone())),
slot_updated: ActiveValue::Set(slot as i64),
..Default::default()
};
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,
])
.to_owned(),
)
.build(DbBackend::Postgres);

conn.execute(query).await?;

Ok(())
}

0 comments on commit bf501bd

Please sign in to comment.