@@ -2,7 +2,42 @@ use std::collections::HashMap;
22
33use crate :: * ;
44
5- pub fn process_create_merkle_tree ( merkle_tree_args : & CreateMerkleTreeArgs ) {
5+ pub fn process_create_merkle_tree ( args : & Args , merkle_tree_args : & CreateMerkleTreeArgs ) {
6+ // Find the next available airdrop version
7+ let mut start_airdrop_version = 0 ;
8+ if args. mint == Pubkey :: default ( ) {
9+ println ! ( "Mint is not set, will start creating merkle trees from version 0" ) ;
10+ }
11+ if args. mint != Pubkey :: default ( ) && merkle_tree_args. start_airdrop_version . is_none ( ) {
12+ println ! ( "Finding next available airdrop version for mint: {}" , args. mint) ;
13+
14+ let program_client = args. get_program_client ( ) ;
15+ let rpc_client = program_client. rpc ( ) ;
16+
17+ let mut current_version = 0 ;
18+ while current_version < 1000000000000000000 {
19+ let ( distributor_pubkey, _bump) =
20+ get_merkle_distributor_pda ( & args. program_id , & args. mint , current_version) ;
21+ match rpc_client. get_account_data ( & distributor_pubkey) {
22+ Ok ( _) => {
23+ println ! ( "Airdrop version {} exists" , current_version) ;
24+ }
25+ Err ( e) => {
26+ if e. to_string ( ) . contains ( "AccountNotFound" ) {
27+ println ! ( "Found next available airdrop version: {}" , current_version) ;
28+ start_airdrop_version = current_version;
29+ break ;
30+ } else {
31+ println ! ( "Failed to get PDA, Error: {}" , e. to_string( ) ) ;
32+ }
33+ }
34+ }
35+ current_version += 1 ;
36+ }
37+ } else if let Some ( version) = merkle_tree_args. start_airdrop_version {
38+ start_airdrop_version = version;
39+ println ! ( "Using provided start airdrop version: {}" , start_airdrop_version) ;
40+ }
641 let mut csv_entries = CsvEntry :: new_from_file ( & merkle_tree_args. csv_path ) . unwrap ( ) ;
742
843 // exclude test address if have
@@ -30,28 +65,28 @@ pub fn process_create_merkle_tree(merkle_tree_args: &CreateMerkleTreeArgs) {
3065 let max_nodes_per_tree = merkle_tree_args. max_nodes_per_tree as usize ;
3166
3267 let base_path = & merkle_tree_args. merkle_tree_path ;
33- let mut index = 0 ;
68+ let mut airdrop_version = start_airdrop_version ;
3469 while csv_entries. len ( ) > 0 {
3570 let last_index = max_nodes_per_tree. min ( csv_entries. len ( ) ) ;
3671 let sub_tree = csv_entries[ 0 ..last_index] . to_vec ( ) ;
3772 csv_entries = csv_entries[ last_index..csv_entries. len ( ) ] . to_vec ( ) ;
3873
39- // use index as version
74+ // use airdrop_version as version
4075 let merkle_tree =
41- AirdropMerkleTree :: new_from_entries ( sub_tree, index , merkle_tree_args. decimals )
76+ AirdropMerkleTree :: new_from_entries ( sub_tree, airdrop_version , merkle_tree_args. decimals )
4277 . unwrap ( ) ;
4378
4479 let base_path_clone = base_path. clone ( ) ;
4580 let path = base_path_clone
4681 . as_path ( )
47- . join ( format ! ( "tree_{}.json" , index ) ) ;
82+ . join ( format ! ( "tree_{}.json" , airdrop_version ) ) ;
4883
4984 merkle_tree. write_to_file ( & path) ;
50- index += 1 ;
85+ airdrop_version += 1 ;
5186 }
5287
5388 if merkle_tree_args. should_include_test_list {
54- println ! ( "create merkle tree for test claming index {}" , index ) ;
89+ println ! ( "create merkle tree for test claming version {}" , airdrop_version ) ;
5590 let test_list = get_test_list ( )
5691 . into_iter ( )
5792 . map ( |x| CsvEntry {
@@ -62,13 +97,17 @@ pub fn process_create_merkle_tree(merkle_tree_args: &CreateMerkleTreeArgs) {
6297 . collect :: < Vec < CsvEntry > > ( ) ;
6398
6499 let merkle_tree =
65- AirdropMerkleTree :: new_from_entries ( test_list, index , merkle_tree_args. decimals as u32 )
100+ AirdropMerkleTree :: new_from_entries ( test_list, airdrop_version , merkle_tree_args. decimals as u32 )
66101 . unwrap ( ) ;
67102 let base_path_clone = base_path. clone ( ) ;
68103 let path = base_path_clone
69104 . as_path ( )
70- . join ( format ! ( "tree_{}.json" , index ) ) ;
105+ . join ( format ! ( "tree_{}.json" , airdrop_version ) ) ;
71106
72107 merkle_tree. write_to_file ( & path) ;
108+ airdrop_version += 1 ;
73109 }
110+
111+ // Output the last airdrop version used
112+ println ! ( "Last airdrop version created: {}" , airdrop_version - 1 ) ;
74113}
0 commit comments