Skip to content

Commit 72d49a4

Browse files
authored
Update controls auth (#105)
* remove metadata check * add double check on signer * split to new require * rename to claimMintAuthority * update naming * add method for controls, update editions * Revert "add method for controls, update editions" * add method for controls, update editions * call update_auth in controls * rename creator vars * final change to editions_controls
1 parent 472d80e commit 72d49a4

File tree

6 files changed

+147
-9
lines changed

6 files changed

+147
-9
lines changed

programs/libreplex_editions/src/instructions/claim_update_authority.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ pub struct ClaimUpdateAuthorityCtx<'info> {
1616
#[account(mut)]
1717
pub payer: Signer<'info>,
1818

19+
#[account(mut)]
20+
pub creator: Signer<'info>,
21+
1922
#[account(mut)]
2023
pub mint: AccountInfo<'info>,
2124

@@ -35,11 +38,10 @@ pub fn claim_update_authority<'info>(ctx: Context<'_, '_, '_, 'info, ClaimUpdate
3538
let mint = &ctx.accounts.mint;
3639
let token_program = &ctx.accounts.token_program;
3740
let editions_deployment = &ctx.accounts.editions_deployment;
38-
let payer = &ctx.accounts.payer;
41+
let creator = &ctx.accounts.creator;
3942

4043
require!(editions_deployment.max_number_of_tokens == editions_deployment.number_of_tokens_issued, EditionsError::MintNotComplete);
41-
require!(editions_deployment.creator.key() == payer.key(), EditionsError::InvalidCreator);
42-
require!(payer.is_signer, EditionsError::InvalidSigner);
44+
require!(editions_deployment.creator.key() == creator.key(), EditionsError::InvalidCreator);
4345

4446
let deployment_seeds: &[&[u8]] = &[
4547
"editions_deployment".as_bytes(),
@@ -48,19 +50,19 @@ pub fn claim_update_authority<'info>(ctx: Context<'_, '_, '_, 'info, ClaimUpdate
4850
];
4951

5052
let account_infos = [
51-
payer.to_account_info(),
5253
editions_deployment.to_account_info(),
53-
mint.to_account_info(),
54+
mint.to_account_info(),
55+
creator.to_account_info(),
5456
token_program.to_account_info(),
5557
];
5658

57-
let payer = OptionalNonZeroPubkey::try_from(Some(payer.to_account_info().key()))?;
59+
let creator_key: OptionalNonZeroPubkey = OptionalNonZeroPubkey::try_from(Some(creator.to_account_info().key()))?;
5860

5961
let update_authority_ix = update_authority(
6062
&spl_token_2022::ID,
6163
&mint.key(),
6264
&editions_deployment.key(),
63-
payer
65+
creator_key
6466
);
6567

6668
invoke_signed(&update_authority_ix, &account_infos, &[deployment_seeds])?;

programs/libreplex_editions_controls/src/errors.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,11 @@ pub enum EditionsError {
3131
InvalidMetadata,
3232

3333
#[msg("Creator fee too high")]
34-
CreatorFeeTooHigh
35-
}
34+
CreatorFeeTooHigh,
35+
36+
#[msg("Invalid creator")]
37+
InvalidCreator,
38+
39+
#[msg("Invalid signer")]
40+
InvalidSigner,
41+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
use anchor_lang::{prelude::*, solana_program::program::invoke_signed};
2+
use anchor_spl::token_2022;
3+
use libreplex_editions::cpi::accounts::ClaimUpdateAuthorityCtx as CpiClaimUpdateAuthorityCtx;
4+
use libreplex_editions::program::LibreplexEditions;
5+
use crate::EditionsControls;
6+
use crate::errors::EditionsError;
7+
use spl_token_metadata_interface::instruction::update_authority;
8+
use spl_pod::optional_keys::OptionalNonZeroPubkey;
9+
#[derive(Accounts)]
10+
pub struct ClaimUpdateAuthorityCtx<'info> {
11+
12+
#[account(mut,
13+
seeds = [
14+
b"editions_controls", editions_deployment.key().as_ref()
15+
], bump)]
16+
pub editions_controls: Account<'info, EditionsControls>,
17+
18+
#[account(mut)]
19+
pub editions_deployment: UncheckedAccount<'info>,
20+
21+
#[account(mut)]
22+
pub payer: Signer<'info>,
23+
24+
#[account(mut)]
25+
pub creator: Signer<'info>,
26+
27+
#[account(mut)]
28+
pub mint: AccountInfo<'info>,
29+
30+
/* BOILERPLATE PROGRAM ACCOUNTS */
31+
/// CHECK: Checked in constraint
32+
#[account(
33+
constraint = token_program.key() == token_2022::ID
34+
)]
35+
pub token_program: UncheckedAccount<'info>,
36+
37+
#[account()]
38+
pub system_program: Program<'info, System>,
39+
40+
pub libreplex_editions_program: Program<'info, LibreplexEditions>
41+
42+
}
43+
44+
pub fn claim_update_authority<'info>(ctx: Context<'_, '_, '_, 'info, ClaimUpdateAuthorityCtx<'info>>) -> Result<()> {
45+
let mint = &ctx.accounts.mint;
46+
let token_program = &ctx.accounts.token_program;
47+
let editions_controls = &ctx.accounts.editions_controls;
48+
let editions_deployment = &ctx.accounts.editions_deployment;
49+
let system_program = &ctx.accounts.system_program;
50+
let payer = &ctx.accounts.payer;
51+
let libreplex_editions_program = &ctx.accounts.libreplex_editions_program;
52+
let creator = &ctx.accounts.creator;
53+
54+
require!(editions_controls.creator.key() == creator.key(), EditionsError::InvalidCreator);
55+
let editions_deployment_key = editions_deployment.key();
56+
57+
let seeds = &[
58+
b"editions_controls",
59+
editions_deployment_key.as_ref(),
60+
&[ctx.bumps.editions_controls],
61+
];
62+
63+
libreplex_editions::cpi::claim_update_authority(
64+
CpiContext::new_with_signer(
65+
libreplex_editions_program.to_account_info(),
66+
CpiClaimUpdateAuthorityCtx {
67+
editions_deployment: editions_deployment.to_account_info(),
68+
mint: mint.to_account_info(),
69+
payer: payer.to_account_info(),
70+
creator: editions_controls.to_account_info(),
71+
token_program: token_program.to_account_info(),
72+
system_program: system_program.to_account_info(),
73+
},
74+
&[seeds]
75+
))?;
76+
77+
let account_infos = [
78+
editions_controls.to_account_info(),
79+
mint.to_account_info(),
80+
creator.to_account_info(),
81+
token_program.to_account_info(),
82+
];
83+
84+
let creator_key: OptionalNonZeroPubkey = OptionalNonZeroPubkey::try_from(Some(creator.to_account_info().key()))?;
85+
86+
let update_authority_ix = update_authority(
87+
&spl_token_2022::ID,
88+
&mint.key(),
89+
&editions_controls.key(),
90+
creator_key
91+
);
92+
93+
invoke_signed(&update_authority_ix, &account_infos, &[seeds])?;
94+
95+
Ok(())
96+
}

programs/libreplex_editions_controls/src/instructions/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ pub use add_phase::*;
1313
pub mod mint_with_controls;
1414
pub use mint_with_controls::*;
1515

16+
pub mod claim_update_authority;
17+
pub use claim_update_authority::*;
18+
19+

target/types/libreplex_editions.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ export type LibreplexEditions = {
149149
"isMut": true,
150150
"isSigner": true
151151
},
152+
{
153+
"name": "creator",
154+
"isMut": true,
155+
"isSigner": true
156+
},
152157
{
153158
"name": "mint",
154159
"isMut": true,
@@ -545,6 +550,11 @@ export const IDL: LibreplexEditions = {
545550
"isMut": true,
546551
"isSigner": true
547552
},
553+
{
554+
"name": "creator",
555+
"isMut": true,
556+
"isSigner": true
557+
},
548558
{
549559
"name": "mint",
550560
"isMut": true,

target/types/libreplex_editions_controls.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,16 @@ export type LibreplexEditionsControls = {
538538
"code": 6009,
539539
"name": "CreatorFeeTooHigh",
540540
"msg": "Creator fee too high"
541+
},
542+
{
543+
"code": 6010,
544+
"name": "InvalidCreator",
545+
"msg": "Invalid creator"
546+
},
547+
{
548+
"code": 6011,
549+
"name": "InvalidSigner",
550+
"msg": "Invalid signer"
541551
}
542552
]
543553
};
@@ -1082,6 +1092,16 @@ export const IDL: LibreplexEditionsControls = {
10821092
"code": 6009,
10831093
"name": "CreatorFeeTooHigh",
10841094
"msg": "Creator fee too high"
1095+
},
1096+
{
1097+
"code": 6010,
1098+
"name": "InvalidCreator",
1099+
"msg": "Invalid creator"
1100+
},
1101+
{
1102+
"code": 6011,
1103+
"name": "InvalidSigner",
1104+
"msg": "Invalid signer"
10851105
}
10861106
]
10871107
};

0 commit comments

Comments
 (0)