Skip to content

Commit

Permalink
Creators and collection batch mint verifications (#204)
Browse files Browse the repository at this point in the history
* feat: add creators and collection bath mint verifications

* style: fmt

* Update blockbuster/blockbuster/src/programs/bubblegum/mod.rs

Co-authored-by: Stanislav Cherviakov <stchervyakov@gmail.com>

* chore: dependency change

* chore: renaming

---------

Co-authored-by: Stanislav Cherviakov <stchervyakov@gmail.com>
  • Loading branch information
n00m4d and StanChe authored Aug 14, 2024
1 parent acf874e commit d37f4c9
Show file tree
Hide file tree
Showing 17 changed files with 1,000 additions and 187 deletions.
4 changes: 0 additions & 4 deletions .gitmodules

This file was deleted.

11 changes: 6 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ log = "0.4.17"
metrics = "0.20.1"
migration = {path = "migration"}
mime_guess = "2.0.4"
mpl-bubblegum = { path = "blockbuster/mpl-bubblegum/clients/rust", features = ["serde"] }
mpl-bubblegum = { git = "https://github.com/adm-metaex/mpl-bubblegum.git", branch = "feature/cleanup", features = ["serde"] }
mpl-core = { git = "https://github.com/RequescoS/mpl-core.git", features = ["serde"] }
mpl-token-metadata = "4.1.1"
nft_ingester = {path = "nft_ingester"}
Expand Down Expand Up @@ -100,18 +100,18 @@ solana-program = "1.18.11"
solana-sdk = "1.18.11"
solana-transaction-status = "1.18.11"
solana-zk-token-sdk = "1.17.16"
spl-account-compression = { path = "blockbuster/mpl-bubblegum/solana-program-library/account-compression/programs/account-compression", features = ["no-entrypoint"] }
spl-account-compression = { git = "https://github.com/StanChe/solana-program-library.git", branch = "feature/init_with_root", features = ["no-entrypoint"] }
spl-associated-token-account = ">= 1.1.3, < 3.0"
spl-concurrent-merkle-tree = { path = "blockbuster/mpl-bubblegum/solana-program-library/libraries/concurrent-merkle-tree"}
spl-noop = { path = "blockbuster/mpl-bubblegum/solana-program-library/account-compression/programs/noop", features = ["no-entrypoint"] }
spl-concurrent-merkle-tree = { git = "https://github.com/StanChe/solana-program-library.git", branch = "feature/init_with_root" }
spl-noop = { git = "https://github.com/StanChe/solana-program-library.git", branch = "feature/init_with_root", features = ["no-entrypoint"] }
spl-pod = {version = "0.1.0", features = ["serde-traits"]}
spl-token = ">= 3.5.0, < 5.0"
spl-token-2022 = {version = "1.0", features = ["no-entrypoint"]}
spl-token-group-interface = "0.1.0"
spl-token-metadata-interface = "0.2.0"
sqlx = "0.6.2"
stretto = "0.8.4"
thiserror = "1.0.31"
thiserror = "1.0.63"
tokio = "1.30.0"
tokio-stream = "0.1.14"
tower = "0.4.13"
Expand All @@ -131,6 +131,7 @@ serde_with = "3.8.1"
bincode = "1.3.3"
tempfile = "3.10.1"
async-channel = "2.3.1"
bubblegum-batch-sdk = { git = "https://github.com/metaplex-foundation/bubblegum-batch-sdk.git", branch = "main" }

[workspace.lints.clippy]
clone_on_ref_ptr = "deny"
Expand Down
8 changes: 4 additions & 4 deletions blockbuster/blockbuster/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ readme = "../README.md"
[dependencies]
bytemuck = { version = "1.14.0", features = ["derive"] }
spl-token-2022 = { version = "1.0", features = ["no-entrypoint"] }
spl-account-compression = { path = "../mpl-bubblegum/solana-program-library/account-compression/programs/account-compression", features = ["no-entrypoint"] }
spl-noop = { path = "../mpl-bubblegum/solana-program-library/account-compression/programs/noop", features = ["no-entrypoint"] }
mpl-bubblegum = { path = "../mpl-bubblegum/clients/rust" }
spl-account-compression = { git = "https://github.com/StanChe/solana-program-library.git", branch = "feature/init_with_root", features = ["no-entrypoint"] }
spl-noop = { workspace = true }
mpl-bubblegum = { workspace = true }
mpl-core = { git = "https://github.com/RequescoS/mpl-core.git", features = ["serde"] }
mpl-token-metadata = { version = "4.1.1", features = ["serde"] }
spl-token = { version = "4.0.0", features = ["no-entrypoint"] }
async-trait = "0.1.57"
bs58 = "0.4.0"
lazy_static = "1.4.0"
borsh = "~0.10.3"
thiserror = "1.0.32"
thiserror = "1.0.63"
log = "0.4.17"
solana-sdk = "~1.18.11"
solana-transaction-status = "~1.18.11"
Expand Down
53 changes: 45 additions & 8 deletions blockbuster/blockbuster/src/programs/bubblegum/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ use log::warn;
use mpl_bubblegum::{
get_instruction_type,
instructions::{
FinalizeTreeWithRootInstructionArgs, UnverifyCreatorInstructionArgs,
UpdateMetadataInstructionArgs, VerifyCreatorInstructionArgs,
FinalizeTreeWithRootAndCollectionInstructionArgs, FinalizeTreeWithRootInstructionArgs,
UnverifyCreatorInstructionArgs, UpdateMetadataInstructionArgs,
VerifyCreatorInstructionArgs,
},
types::{BubblegumEventType, MetadataArgs, UpdateArgs},
};
Expand All @@ -29,25 +30,28 @@ use spl_noop;
#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FinalizeTreeWithRootInstructionArgsWithStaker {
pub rightmost_root: [u8; 32],
pub root: [u8; 32],
pub rightmost_leaf: [u8; 32],
pub rightmost_index: u32,
pub metadata_url: String,
pub metadata_hash: String,
pub staker: Pubkey,
pub collection_mint: Option<Pubkey>,
}
impl FinalizeTreeWithRootInstructionArgsWithStaker {
fn build_finalize_tree_with_root_instruction_args_with_staker(
args: FinalizeTreeWithRootInstructionArgs,
staker: Pubkey,
collection_mint: Option<Pubkey>,
) -> Self {
Self {
rightmost_root: args.rightmost_root,
root: args.root,
rightmost_leaf: args.rightmost_leaf,
rightmost_index: args.rightmost_index,
metadata_url: args.metadata_url,
metadata_hash: args.metadata_hash,
staker,
collection_mint,
}
}
}
Expand Down Expand Up @@ -80,7 +84,7 @@ pub enum Payload {
update_args: UpdateArgs,
tree_id: Pubkey,
},
CreateTreeWithRoot {
FinalizeTreeWithRoot {
args: FinalizeTreeWithRootInstructionArgsWithStaker,
tree_id: Pubkey,
},
Expand Down Expand Up @@ -237,9 +241,14 @@ impl ProgramParser for BubblegumParser {
InstructionName::UpdateMetadata => {
b_inst.payload = Some(build_update_metadata_payload(keys, ix_data)?);
}
InstructionName::CreateTreeWithRoot => {
InstructionName::FinalizeTreeWithRoot => {
b_inst.payload = Some(build_create_tree_with_root_payload(keys, ix_data)?);
}
InstructionName::FinalizeTreeWithRootAndCollection => {
b_inst.payload = Some(build_create_tree_with_root_and_collection_payload(
keys, ix_data,
)?);
}
_ => {}
};
}
Expand Down Expand Up @@ -348,7 +357,35 @@ fn build_create_tree_with_root_payload(
let staker = *keys
.get(4)
.ok_or(BlockbusterError::InstructionParsingError)?;
let args = FinalizeTreeWithRootInstructionArgsWithStaker::build_finalize_tree_with_root_instruction_args_with_staker(args, staker);
let args = FinalizeTreeWithRootInstructionArgsWithStaker::build_finalize_tree_with_root_instruction_args_with_staker(args, staker, None);

Ok(Payload::FinalizeTreeWithRoot { args, tree_id })
}

// See Bubblegum for offsets and positions:
// https://github.com/metaplex-foundation/mpl-bubblegum/blob/main/programs/bubblegum/README.md
fn build_create_tree_with_root_and_collection_payload(
keys: &[Pubkey],
ix_data: &[u8],
) -> Result<Payload, BlockbusterError> {
let args = FinalizeTreeWithRootAndCollectionInstructionArgs::try_from_slice(ix_data)?;

let tree_id = *keys
.get(1)
.ok_or(BlockbusterError::InstructionParsingError)?;
let staker = *keys
.get(4)
.ok_or(BlockbusterError::InstructionParsingError)?;
let collection_mint = *keys
.get(11)
.ok_or(BlockbusterError::InstructionParsingError)?;
let args = FinalizeTreeWithRootInstructionArgsWithStaker::build_finalize_tree_with_root_instruction_args_with_staker(FinalizeTreeWithRootInstructionArgs {
root: args.root,
rightmost_leaf: args.rightmost_leaf,
rightmost_index: args.rightmost_index,
metadata_url: args.metadata_url,
metadata_hash: args.metadata_hash,
}, staker, Some(collection_mint));

Ok(Payload::CreateTreeWithRoot { args, tree_id })
Ok(Payload::FinalizeTreeWithRoot { args, tree_id })
}
3 changes: 3 additions & 0 deletions digital_asset_types/src/dao/generated/batch_mint_to_verify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub struct Model {
pub created_at_slot: i64,
pub signature: String,
pub staker: Vec<u8>,
pub collection: Option<Vec<u8>>,
pub download_attempts: i32,
pub batch_mint_persisting_state: BatchMintPersistingState,
pub batch_mint_fail_status: Option<BatchMintFailStatus>,
Expand All @@ -33,6 +34,7 @@ pub enum Column {
CreatedAtSlot,
Signature,
Staker,
Collection,
DownloadAttempts,
BatchMintPersistingState,
BatchMintFailStatus,
Expand Down Expand Up @@ -62,6 +64,7 @@ impl ColumnTrait for Column {
Self::CreatedAtSlot => ColumnType::BigInteger.def(),
Self::Signature => ColumnType::String(None).def(),
Self::Staker => ColumnType::Binary.def(),
Self::Collection => ColumnType::Binary.def().null(),
Self::DownloadAttempts => ColumnType::Integer.def(),
Self::BatchMintPersistingState => BatchMintPersistingState::db_type(),
Self::BatchMintFailStatus => BatchMintFailStatus::db_type().null(),
Expand Down
2 changes: 0 additions & 2 deletions digital_asset_types/src/dao/generated/prelude.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
//! SeaORM Entity. Generated by sea-orm-codegen 0.9.3

#![allow(unused_imports)]

pub use super::asset::Entity as Asset;
pub use super::asset_authority::Entity as AssetAuthority;
pub use super::asset_creators::Entity as AssetCreators;
Expand Down
Loading

0 comments on commit d37f4c9

Please sign in to comment.