1
1
use anyhow:: Result ;
2
- use metaplex_token_metadata:: { id, instruction:: update_metadata_accounts, state:: Data } ;
2
+ use metaplex_token_metadata:: {
3
+ id,
4
+ instruction:: update_metadata_accounts,
5
+ state:: { Data , Metadata } ,
6
+ } ;
3
7
use retry:: { delay:: Exponential , retry} ;
4
8
use solana_client:: rpc_client:: RpcClient ;
5
9
use solana_sdk:: {
@@ -12,22 +16,18 @@ use spl_associated_token_account::get_associated_token_address;
12
16
use spl_token;
13
17
use std:: str:: FromStr ;
14
18
19
+ use crate :: decode:: decode;
15
20
use crate :: derive:: derive_metadata_pda;
16
21
use crate :: parse:: parse_keypair;
17
22
18
- pub fn burn_one (
19
- client : & RpcClient ,
20
- keypair : String ,
21
- owner_wallet : String ,
22
- mint_address : String ,
23
- ) -> Result < ( ) > {
23
+ pub fn burn_one ( client : & RpcClient , keypair : String , mint_address : String ) -> Result < ( ) > {
24
24
let mint_pubkey = Pubkey :: from_str ( & mint_address) ?;
25
25
let keypair = parse_keypair ( & keypair) ?;
26
- let owner_pubkey = Pubkey :: from_str ( & owner_wallet ) ? ;
26
+ let owner_pubkey = keypair . pubkey ( ) ;
27
27
28
28
let sig = burn ( client, & keypair, & owner_pubkey, & mint_pubkey, 1 ) ?;
29
29
30
- println ! ( "{}" , sig) ;
30
+ println ! ( "TxId: {}" , sig) ;
31
31
32
32
Ok ( ( ) )
33
33
}
@@ -59,24 +59,25 @@ pub fn burn(
59
59
& [ & signer. pubkey ( ) ] ,
60
60
) ?;
61
61
62
- let metadata_pubkey = derive_metadata_pda ( mint_pubkey ) ;
62
+ let mut instructions = vec ! [ burn_ix , close_associated_token_account ] ;
63
63
64
- let data = default_data ( ) ;
64
+ let metadata : Metadata = decode ( client , & mint_pubkey . to_string ( ) ) ? ;
65
65
66
- let clear_metadata_account = update_metadata_accounts (
67
- id ( ) ,
68
- metadata_pubkey,
69
- signer. pubkey ( ) ,
70
- None ,
71
- Some ( data) ,
72
- None ,
73
- ) ;
66
+ if signer. pubkey ( ) == metadata. update_authority {
67
+ let metadata_pubkey = derive_metadata_pda ( mint_pubkey) ;
74
68
75
- let instructions = vec ! [
76
- burn_ix,
77
- close_associated_token_account,
78
- clear_metadata_account,
79
- ] ;
69
+ let data = default_data ( ) ;
70
+
71
+ let clear_metadata_account = update_metadata_accounts (
72
+ id ( ) ,
73
+ metadata_pubkey,
74
+ signer. pubkey ( ) ,
75
+ None ,
76
+ Some ( data) ,
77
+ None ,
78
+ ) ;
79
+ instructions. push ( clear_metadata_account) ;
80
+ }
80
81
81
82
let ( recent_blockhash, _) = client. get_recent_blockhash ( ) ?;
82
83
let tx = Transaction :: new_signed_with_payer (
0 commit comments