Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit d674818

Browse files
committed
token 2022: add GroupMemberPointer extension
1 parent 1c96261 commit d674818

File tree

5 files changed

+23
-225
lines changed

5 files changed

+23
-225
lines changed

token/client/src/token.rs

-10
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,6 @@ pub enum ExtensionInitializationParams {
178178
},
179179
GroupMemberPointer {
180180
authority: Option<Pubkey>,
181-
group_update_authority: Pubkey,
182-
group_address: Pubkey,
183181
member_address: Option<Pubkey>,
184182
},
185183
}
@@ -303,15 +301,11 @@ impl ExtensionInitializationParams {
303301
),
304302
Self::GroupMemberPointer {
305303
authority,
306-
group_update_authority,
307-
group_address,
308304
member_address,
309305
} => group_member_pointer::instruction::initialize(
310306
token_program_id,
311307
mint,
312308
authority,
313-
&group_update_authority,
314-
&group_address,
315309
member_address,
316310
),
317311
}
@@ -1724,8 +1718,6 @@ where
17241718
pub async fn update_group_member_address<S: Signers>(
17251719
&self,
17261720
authority: &Pubkey,
1727-
group_update_authority: &Pubkey,
1728-
group_address: &Pubkey,
17291721
new_member_address: Option<Pubkey>,
17301722
signing_keypairs: &S,
17311723
) -> TokenResult<T::Output> {
@@ -1737,9 +1729,7 @@ where
17371729
&self.program_id,
17381730
self.get_address(),
17391731
authority,
1740-
group_update_authority,
17411732
&multisig_signers,
1742-
group_address,
17431733
new_member_address,
17441734
)?],
17451735
signing_keypairs,

token/program-2022-test/tests/group_member_pointer.rs

+12-141
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
#![cfg(feature = "test-sbf")]
22

3-
use {
4-
solana_program::system_instruction, solana_program_test::tokio::sync::Mutex,
5-
spl_token_2022::extension::ExtensionType,
6-
};
7-
83
mod program_test;
94
use {
105
program_test::{TestContext, TokenContext},
11-
solana_program_test::{processor, tokio, ProgramTest, ProgramTestContext},
6+
solana_program_test::{
7+
processor,
8+
tokio::{self, sync::Mutex},
9+
ProgramTest, ProgramTestContext,
10+
},
1211
solana_sdk::{
1312
account::Account as SolanaAccount,
1413
instruction::InstructionError,
@@ -21,14 +20,10 @@ use {
2120
spl_token_2022::{
2221
error::TokenError,
2322
extension::{
24-
group_member_pointer::{
25-
instruction::{initialize, update},
26-
GroupMemberPointer,
27-
},
23+
group_member_pointer::{instruction::update, GroupMemberPointer},
2824
BaseStateWithExtensions,
2925
},
3026
processor::Processor,
31-
state::Mint,
3227
},
3328
spl_token_client::token::{ExtensionInitializationParams, TokenError as TokenClientError},
3429
std::{convert::TryInto, sync::Arc},
@@ -91,26 +86,21 @@ async fn setup_token_group(
9186
async fn setup_member_mint(
9287
context: Arc<Mutex<ProgramTestContext>>,
9388
mint: Keypair,
94-
group_address: &Pubkey,
9589
authority: &Pubkey,
96-
group_update_authority: &Keypair,
9790
) -> TestContext {
9891
let mut context = TestContext {
9992
context,
10093
token_context: None,
10194
};
10295
let member_address = Some(mint.pubkey());
10396
context
104-
.init_token_with_mint_keypair_and_freeze_authority_and_additional_signers(
97+
.init_token_with_mint_keypair_and_freeze_authority(
10598
mint,
10699
vec![ExtensionInitializationParams::GroupMemberPointer {
107100
authority: Some(*authority),
108-
group_address: *group_address,
109-
group_update_authority: group_update_authority.pubkey(),
110101
member_address,
111102
}],
112103
None,
113-
&[&group_update_authority],
114104
)
115105
.await
116106
.unwrap();
@@ -158,9 +148,7 @@ async fn success_init() {
158148
let member_token = setup_member_mint(
159149
context,
160150
member_mint.insecure_clone(),
161-
&group_mint.pubkey(),
162151
&member_authority.pubkey(),
163-
&group_update_authority,
164152
)
165153
.await
166154
.token_context
@@ -175,7 +163,6 @@ async fn success_init() {
175163
extension.authority,
176164
Some(member_authority.pubkey()).try_into().unwrap()
177165
);
178-
assert_eq!(extension.group_address, group_mint.pubkey());
179166
assert_eq!(
180167
extension.member_address,
181168
Some(member_mint.pubkey()).try_into().unwrap()
@@ -187,8 +174,6 @@ async fn fail_init() {
187174
let payer = Keypair::new();
188175
let group_mint = Keypair::new();
189176
let group_update_authority = Keypair::new();
190-
let member_mint = Keypair::new();
191-
let member_authority = Keypair::new();
192177

193178
let program_test = setup_program_test();
194179
let mut context = program_test.start_with_context().await;
@@ -226,16 +211,13 @@ async fn fail_init() {
226211
token_context: None,
227212
};
228213
let err = context
229-
.init_token_with_mint_keypair_and_freeze_authority_and_additional_signers(
214+
.init_token_with_mint_keypair_and_freeze_authority(
230215
Keypair::new(),
231216
vec![ExtensionInitializationParams::GroupMemberPointer {
232217
authority: None,
233-
group_address: group_mint.pubkey(),
234-
group_update_authority: group_update_authority.pubkey(),
235218
member_address: None,
236219
}],
237220
None,
238-
&[&group_update_authority],
239221
)
240222
.await
241223
.unwrap_err();
@@ -248,53 +230,6 @@ async fn fail_init() {
248230
)
249231
)))
250232
);
251-
252-
// fail missing group update authority signature
253-
let mut context = context.context.lock().await;
254-
let space =
255-
ExtensionType::try_calculate_account_len::<Mint>(&[ExtensionType::GroupMemberPointer])
256-
.unwrap();
257-
let lamports = context
258-
.banks_client
259-
.get_rent()
260-
.await
261-
.unwrap()
262-
.minimum_balance(space);
263-
let mut instruction = initialize(
264-
&spl_token_2022::id(),
265-
&member_mint.pubkey(),
266-
Some(member_authority.pubkey()),
267-
&group_update_authority.pubkey(),
268-
&group_mint.pubkey(),
269-
Some(member_mint.pubkey()),
270-
)
271-
.unwrap();
272-
instruction.accounts[2].is_signer = false;
273-
let transaction = Transaction::new_signed_with_payer(
274-
&[
275-
system_instruction::create_account(
276-
&payer.pubkey(),
277-
&member_mint.pubkey(),
278-
lamports,
279-
space as u64,
280-
&spl_token_2022::id(),
281-
),
282-
instruction,
283-
],
284-
Some(&payer.pubkey()),
285-
&[&payer, &member_mint],
286-
context.last_blockhash,
287-
);
288-
let error = context
289-
.banks_client
290-
.process_transaction(transaction)
291-
.await
292-
.unwrap_err()
293-
.unwrap();
294-
assert_eq!(
295-
error,
296-
TransactionError::InstructionError(1, InstructionError::MissingRequiredSignature,)
297-
);
298233
}
299234

300235
#[tokio::test]
@@ -338,9 +273,7 @@ async fn success_update() {
338273
let member_token = setup_member_mint(
339274
context.clone(),
340275
member_mint.insecure_clone(),
341-
&group_mint.pubkey(),
342276
&member_authority.pubkey(),
343-
&group_update_authority,
344277
)
345278
.await
346279
.token_context
@@ -354,8 +287,6 @@ async fn success_update() {
354287
member_token
355288
.update_group_member_address(
356289
&member_authority.pubkey(),
357-
&group_update_authority.pubkey(),
358-
&group_mint.pubkey(),
359290
Some(new_member_address),
360291
&[&group_update_authority, &member_authority],
361292
)
@@ -368,7 +299,6 @@ async fn success_update() {
368299
extension.authority,
369300
Some(member_authority.pubkey()).try_into().unwrap()
370301
);
371-
assert_eq!(extension.group_address, group_mint.pubkey());
372302
assert_eq!(
373303
extension.member_address,
374304
Some(new_member_address).try_into().unwrap()
@@ -378,8 +308,6 @@ async fn success_update() {
378308
member_token
379309
.update_group_member_address(
380310
&member_authority.pubkey(),
381-
&group_update_authority.pubkey(),
382-
&group_mint.pubkey(),
383311
None,
384312
&[&group_update_authority, &member_authority],
385313
)
@@ -392,7 +320,6 @@ async fn success_update() {
392320
extension.authority,
393321
Some(member_authority.pubkey()).try_into().unwrap()
394322
);
395-
assert_eq!(extension.group_address, group_mint.pubkey());
396323
assert_eq!(extension.member_address, None.try_into().unwrap());
397324
}
398325

@@ -437,9 +364,7 @@ async fn fail_update() {
437364
let member_token = setup_member_mint(
438365
context.clone(),
439366
member_mint.insecure_clone(),
440-
&group_mint.pubkey(),
441367
&member_authority.pubkey(),
442-
&group_update_authority,
443368
)
444369
.await
445370
.token_context
@@ -450,33 +375,10 @@ async fn fail_update() {
450375
let wrong = Keypair::new();
451376
let new_member_address = Pubkey::new_unique();
452377

453-
// fail, wrong signature for group update authority
454-
let err = member_token
455-
.update_group_member_address(
456-
&member_authority.pubkey(),
457-
&wrong.pubkey(),
458-
&group_mint.pubkey(),
459-
Some(new_member_address),
460-
&[&wrong, &member_authority],
461-
)
462-
.await
463-
.unwrap_err();
464-
assert_eq!(
465-
err,
466-
TokenClientError::Client(Box::new(TransportError::TransactionError(
467-
TransactionError::InstructionError(
468-
0,
469-
InstructionError::Custom(TokenError::OwnerMismatch as u32)
470-
)
471-
)))
472-
);
473-
474-
// fail, wrong signature for member pointer authority
378+
// fail, wrong signature for authority
475379
let err = member_token
476380
.update_group_member_address(
477381
&wrong.pubkey(),
478-
&group_update_authority.pubkey(),
479-
&group_mint.pubkey(),
480382
Some(new_member_address),
481383
&[&group_update_authority, &wrong],
482384
)
@@ -494,51 +396,20 @@ async fn fail_update() {
494396

495397
let mut context = context.lock().await;
496398

497-
// fail, missing group update authority signature
399+
// fail, missing authority signature
498400
let mut instruction = update(
499401
&spl_token_2022::id(),
500402
&member_mint.pubkey(),
501403
&member_authority.pubkey(),
502-
&group_update_authority.pubkey(),
503-
&[],
504-
&group_mint.pubkey(),
505-
Some(member_mint.pubkey()),
506-
)
507-
.unwrap();
508-
instruction.accounts[3].is_signer = false;
509-
let transaction = Transaction::new_signed_with_payer(
510-
&[instruction],
511-
Some(&payer.pubkey()),
512-
&[&payer, &member_authority],
513-
context.last_blockhash,
514-
);
515-
let error = context
516-
.banks_client
517-
.process_transaction(transaction)
518-
.await
519-
.unwrap_err()
520-
.unwrap();
521-
assert_eq!(
522-
error,
523-
TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature,)
524-
);
525-
526-
// fail, missing member pointer authority signature
527-
let mut instruction = update(
528-
&spl_token_2022::id(),
529-
&member_mint.pubkey(),
530-
&member_authority.pubkey(),
531-
&group_update_authority.pubkey(),
532404
&[],
533-
&group_mint.pubkey(),
534405
Some(member_mint.pubkey()),
535406
)
536407
.unwrap();
537-
instruction.accounts[2].is_signer = false;
408+
instruction.accounts[1].is_signer = false;
538409
let transaction = Transaction::new_signed_with_payer(
539410
&[instruction],
540411
Some(&payer.pubkey()),
541-
&[&payer, &group_update_authority],
412+
&[&payer],
542413
context.last_blockhash,
543414
);
544415
let error = context

0 commit comments

Comments
 (0)