Skip to content

Commit 496e315

Browse files
committed
solana: Add revertTokenAuthority to cancel set token authority flow.
1 parent 9a40f7f commit 496e315

File tree

4 files changed

+189
-38
lines changed

4 files changed

+189
-38
lines changed

solana/programs/example-native-token-transfers/src/instructions/admin.rs

+26-17
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,12 @@ pub struct SetTokenAuthority<'info> {
178178
#[account(
179179
seeds = [crate::TOKEN_AUTHORITY_SEED],
180180
bump,
181-
constraint = mint.mint_authority.unwrap() == token_authority.key() @ NTTError::InvalidMintAuthority
181+
address = mint.mint_authority.unwrap() @ NTTError::InvalidMintAuthority
182182
)]
183183
/// CHECK: The constraints enforce this is valid mint authority
184184
pub token_authority: UncheckedAccount<'info>,
185185

186-
/// CHECK: The rent payer of the [PendingTokenAuthority] storing this account will be the signer in the [claim_token_authority] instruction.
186+
/// CHECK: This account will be the signer in the [claim_token_authority] instruction.
187187
pub new_authority: UncheckedAccount<'info>,
188188
}
189189

@@ -245,7 +245,7 @@ pub fn set_token_authority_one_step_unchecked(
245245
}
246246

247247
#[derive(Accounts)]
248-
pub struct ClaimTokenAuthority<'info> {
248+
pub struct RevertTokenAuthority<'info> {
249249
#[account(
250250
constraint = config.paused @ NTTError::NotPaused,
251251
)]
@@ -255,7 +255,8 @@ pub struct ClaimTokenAuthority<'info> {
255255
mut,
256256
address = pending_token_authority.rent_payer @ NTTError::IncorrectRentPayer,
257257
)]
258-
pub payer: Signer<'info>,
258+
/// CHECK: the constraint enforces that this is the correct address
259+
pub payer: UncheckedAccount<'info>,
259260

260261
#[account(
261262
mut,
@@ -271,15 +272,6 @@ pub struct ClaimTokenAuthority<'info> {
271272
/// CHECK: The seeds constraint enforces that this is the correct address
272273
pub token_authority: UncheckedAccount<'info>,
273274

274-
#[account(
275-
constraint = (
276-
new_authority.key() == pending_token_authority.pending_authority
277-
|| new_authority.key() == token_authority.key()
278-
) @ NTTError::InvalidPendingTokenAuthority
279-
)]
280-
/// CHECK: constraint ensures that this is the correct address
281-
pub new_authority: UncheckedAccount<'info>,
282-
283275
#[account(
284276
mut,
285277
seeds = [PendingTokenAuthority::SEED_PREFIX],
@@ -293,15 +285,32 @@ pub struct ClaimTokenAuthority<'info> {
293285
pub system_program: Program<'info, System>,
294286
}
295287

288+
pub fn revert_token_authority(_ctx: Context<RevertTokenAuthority>) -> Result<()> {
289+
Ok(())
290+
}
291+
292+
#[derive(Accounts)]
293+
pub struct ClaimTokenAuthority<'info> {
294+
pub common: RevertTokenAuthority<'info>,
295+
296+
#[account(
297+
address = common.pending_token_authority.pending_authority @ NTTError::InvalidPendingTokenAuthority
298+
)]
299+
pub new_authority: Signer<'info>,
300+
}
301+
296302
pub fn claim_token_authority(ctx: Context<ClaimTokenAuthority>) -> Result<()> {
297303
token_interface::set_authority(
298304
CpiContext::new_with_signer(
299-
ctx.accounts.token_program.to_account_info(),
305+
ctx.accounts.common.token_program.to_account_info(),
300306
token_interface::SetAuthority {
301-
account_or_mint: ctx.accounts.mint.to_account_info(),
302-
current_authority: ctx.accounts.token_authority.to_account_info(),
307+
account_or_mint: ctx.accounts.common.mint.to_account_info(),
308+
current_authority: ctx.accounts.common.token_authority.to_account_info(),
303309
},
304-
&[&[crate::TOKEN_AUTHORITY_SEED, &[ctx.bumps.token_authority]]],
310+
&[&[
311+
crate::TOKEN_AUTHORITY_SEED,
312+
&[ctx.bumps.common.token_authority],
313+
]],
305314
),
306315
AuthorityType::MintTokens,
307316
Some(ctx.accounts.new_authority.key()),

solana/programs/example-native-token-transfers/src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ pub mod example_native_token_transfers {
137137
instructions::set_token_authority_one_step_unchecked(ctx)
138138
}
139139

140+
pub fn revert_token_authority(ctx: Context<RevertTokenAuthority>) -> Result<()> {
141+
instructions::revert_token_authority(ctx)
142+
}
143+
140144
pub fn claim_token_authority(ctx: Context<ClaimTokenAuthority>) -> Result<()> {
141145
instructions::claim_token_authority(ctx)
142146
}

solana/ts/idl/3_0_0/json/example_native_token_transfers.json

+53-7
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@
812812
"args": []
813813
},
814814
{
815-
"name": "claimTokenAuthority",
815+
"name": "revertTokenAuthority",
816816
"accounts": [
817817
{
818818
"name": "config",
@@ -822,7 +822,7 @@
822822
{
823823
"name": "payer",
824824
"isMut": true,
825-
"isSigner": true
825+
"isSigner": false
826826
},
827827
{
828828
"name": "mint",
@@ -834,11 +834,6 @@
834834
"isMut": false,
835835
"isSigner": false
836836
},
837-
{
838-
"name": "newAuthority",
839-
"isMut": false,
840-
"isSigner": false
841-
},
842837
{
843838
"name": "pendingTokenAuthority",
844839
"isMut": true,
@@ -857,6 +852,57 @@
857852
],
858853
"args": []
859854
},
855+
{
856+
"name": "claimTokenAuthority",
857+
"accounts": [
858+
{
859+
"name": "common",
860+
"accounts": [
861+
{
862+
"name": "config",
863+
"isMut": false,
864+
"isSigner": false
865+
},
866+
{
867+
"name": "payer",
868+
"isMut": true,
869+
"isSigner": false
870+
},
871+
{
872+
"name": "mint",
873+
"isMut": true,
874+
"isSigner": false
875+
},
876+
{
877+
"name": "tokenAuthority",
878+
"isMut": false,
879+
"isSigner": false
880+
},
881+
{
882+
"name": "pendingTokenAuthority",
883+
"isMut": true,
884+
"isSigner": false
885+
},
886+
{
887+
"name": "tokenProgram",
888+
"isMut": false,
889+
"isSigner": false
890+
},
891+
{
892+
"name": "systemProgram",
893+
"isMut": false,
894+
"isSigner": false
895+
}
896+
]
897+
},
898+
{
899+
"name": "newAuthority",
900+
"isMut": false,
901+
"isSigner": true
902+
}
903+
],
904+
"args": []
905+
},
860906
{
861907
"name": "setPaused",
862908
"accounts": [

solana/ts/idl/3_0_0/ts/example_native_token_transfers.ts

+106-14
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ export type ExampleNativeTokenTransfers = {
812812
"args": []
813813
},
814814
{
815-
"name": "claimTokenAuthority",
815+
"name": "revertTokenAuthority",
816816
"accounts": [
817817
{
818818
"name": "config",
@@ -822,7 +822,7 @@ export type ExampleNativeTokenTransfers = {
822822
{
823823
"name": "payer",
824824
"isMut": true,
825-
"isSigner": true
825+
"isSigner": false
826826
},
827827
{
828828
"name": "mint",
@@ -834,11 +834,6 @@ export type ExampleNativeTokenTransfers = {
834834
"isMut": false,
835835
"isSigner": false
836836
},
837-
{
838-
"name": "newAuthority",
839-
"isMut": false,
840-
"isSigner": false
841-
},
842837
{
843838
"name": "pendingTokenAuthority",
844839
"isMut": true,
@@ -857,6 +852,57 @@ export type ExampleNativeTokenTransfers = {
857852
],
858853
"args": []
859854
},
855+
{
856+
"name": "claimTokenAuthority",
857+
"accounts": [
858+
{
859+
"name": "common",
860+
"accounts": [
861+
{
862+
"name": "config",
863+
"isMut": false,
864+
"isSigner": false
865+
},
866+
{
867+
"name": "payer",
868+
"isMut": true,
869+
"isSigner": false
870+
},
871+
{
872+
"name": "mint",
873+
"isMut": true,
874+
"isSigner": false
875+
},
876+
{
877+
"name": "tokenAuthority",
878+
"isMut": false,
879+
"isSigner": false
880+
},
881+
{
882+
"name": "pendingTokenAuthority",
883+
"isMut": true,
884+
"isSigner": false
885+
},
886+
{
887+
"name": "tokenProgram",
888+
"isMut": false,
889+
"isSigner": false
890+
},
891+
{
892+
"name": "systemProgram",
893+
"isMut": false,
894+
"isSigner": false
895+
}
896+
]
897+
},
898+
{
899+
"name": "newAuthority",
900+
"isMut": false,
901+
"isSigner": true
902+
}
903+
],
904+
"args": []
905+
},
860906
{
861907
"name": "setPaused",
862908
"accounts": [
@@ -3009,7 +3055,7 @@ export const IDL: ExampleNativeTokenTransfers = {
30093055
"args": []
30103056
},
30113057
{
3012-
"name": "claimTokenAuthority",
3058+
"name": "revertTokenAuthority",
30133059
"accounts": [
30143060
{
30153061
"name": "config",
@@ -3019,7 +3065,7 @@ export const IDL: ExampleNativeTokenTransfers = {
30193065
{
30203066
"name": "payer",
30213067
"isMut": true,
3022-
"isSigner": true
3068+
"isSigner": false
30233069
},
30243070
{
30253071
"name": "mint",
@@ -3031,11 +3077,6 @@ export const IDL: ExampleNativeTokenTransfers = {
30313077
"isMut": false,
30323078
"isSigner": false
30333079
},
3034-
{
3035-
"name": "newAuthority",
3036-
"isMut": false,
3037-
"isSigner": false
3038-
},
30393080
{
30403081
"name": "pendingTokenAuthority",
30413082
"isMut": true,
@@ -3054,6 +3095,57 @@ export const IDL: ExampleNativeTokenTransfers = {
30543095
],
30553096
"args": []
30563097
},
3098+
{
3099+
"name": "claimTokenAuthority",
3100+
"accounts": [
3101+
{
3102+
"name": "common",
3103+
"accounts": [
3104+
{
3105+
"name": "config",
3106+
"isMut": false,
3107+
"isSigner": false
3108+
},
3109+
{
3110+
"name": "payer",
3111+
"isMut": true,
3112+
"isSigner": false
3113+
},
3114+
{
3115+
"name": "mint",
3116+
"isMut": true,
3117+
"isSigner": false
3118+
},
3119+
{
3120+
"name": "tokenAuthority",
3121+
"isMut": false,
3122+
"isSigner": false
3123+
},
3124+
{
3125+
"name": "pendingTokenAuthority",
3126+
"isMut": true,
3127+
"isSigner": false
3128+
},
3129+
{
3130+
"name": "tokenProgram",
3131+
"isMut": false,
3132+
"isSigner": false
3133+
},
3134+
{
3135+
"name": "systemProgram",
3136+
"isMut": false,
3137+
"isSigner": false
3138+
}
3139+
]
3140+
},
3141+
{
3142+
"name": "newAuthority",
3143+
"isMut": false,
3144+
"isSigner": true
3145+
}
3146+
],
3147+
"args": []
3148+
},
30573149
{
30583150
"name": "setPaused",
30593151
"accounts": [

0 commit comments

Comments
 (0)