Skip to content

Commit 73b2d2d

Browse files
authored
Block pointer to token-2022 mint (#246)
1 parent 9065312 commit 73b2d2d

File tree

2 files changed

+12
-33
lines changed

2 files changed

+12
-33
lines changed

program/src/metadata.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,14 @@ pub fn resolve_token_2022_source_metadata<'a>(
7272
}
7373

7474
if metadata_info.owner == &token_2022_id() {
75-
// Scenario 2: points to another token-2022 mint
76-
let data = metadata_info.try_borrow_data()?;
77-
let state = PodStateWithExtensions::<PodMint>::unpack(&data)?;
78-
state.get_variable_len_extension::<TokenMetadata>()
75+
// This is explicitly unsupported. A metadata pointer should not point to
76+
// another mint account.
77+
Err(ProgramError::InvalidAccountData)
7978
} else if metadata_info.owner == &MPL_TOKEN_METADATA_ID {
80-
// Scenario 3: points to a Metaplex PDA
79+
// Scenario 2: points to a Metaplex PDA
8180
metaplex_to_token_2022_metadata(unwrapped_mint_info, metadata_info)
8281
} else {
83-
// Scenario 4: points to an external program
82+
// Scenario 3: points to an external program
8483
let owner_program_info =
8584
maybe_owner_program_info.ok_or(ProgramError::NotEnoughAccountKeys)?;
8685
if owner_program_info.key != metadata_info.owner {

program/tests/test_pointer_sync.rs

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fn test_fail_pointer_to_token_2022_account_metadata_unsupported() {
142142
}
143143

144144
#[test]
145-
fn test_pointing_to_token_2022_success() {
145+
fn test_fail_pointer_to_token_2022_mint() {
146146
let metadata_source_mint_key = Pubkey::new_unique();
147147
let unwrapped_mint = MintBuilder::new()
148148
.token_program(TokenProgram::SplToken2022)
@@ -155,40 +155,20 @@ fn test_pointing_to_token_2022_success() {
155155
name: "Mock Token".to_string(),
156156
symbol: "MOCK".to_string(),
157157
uri: "https://example.com/mock.json".to_string(),
158-
additional_metadata: vec![("mock_key".to_string(), "mock_value".to_string())],
158+
additional_metadata: vec![],
159159
};
160-
let mut mock_metadata_account = MintBuilder::new()
160+
161+
let source_metadata_account = MintBuilder::new()
161162
.token_program(TokenProgram::SplToken2022)
162163
.mint_key(metadata_source_mint_key)
163164
.with_extension(source_metadata_extension.clone())
164165
.build();
165-
mock_metadata_account.account.owner = mock_metadata_owner::ID;
166166

167-
let result = SyncMetadataBuilder::new()
167+
SyncMetadataBuilder::new()
168168
.unwrapped_mint(unwrapped_mint)
169-
.source_metadata(mock_metadata_account)
169+
.source_metadata(source_metadata_account)
170+
.check(Check::err(ProgramError::InvalidAccountData))
170171
.execute();
171-
172-
let wrapped_mint_state =
173-
PodStateWithExtensions::<PodMint>::unpack(&result.wrapped_mint.account.data).unwrap();
174-
let wrapped_metadata = wrapped_mint_state
175-
.get_variable_len_extension::<TokenMetadata>()
176-
.unwrap();
177-
178-
if let MintExtension::TokenMetadata {
179-
name,
180-
symbol,
181-
uri,
182-
additional_metadata,
183-
} = source_metadata_extension
184-
{
185-
assert_eq!(wrapped_metadata.name, name);
186-
assert_eq!(wrapped_metadata.symbol, symbol);
187-
assert_eq!(wrapped_metadata.uri, uri);
188-
assert_eq!(wrapped_metadata.additional_metadata, additional_metadata);
189-
} else {
190-
panic!("Unexpected extension type");
191-
}
192172
}
193173

194174
#[test]

0 commit comments

Comments
 (0)