Skip to content

Commit 2b77dd3

Browse files
committed
Make register_transceiver init_if_needed to double as reenable
1 parent b3305a5 commit 2b77dd3

File tree

2 files changed

+25
-13
lines changed
  • solana/programs/example-native-token-transfers/src

2 files changed

+25
-13
lines changed

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

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ pub enum NTTError {
6363
InvalidMultisig,
6464
#[msg("ThresholdTooHigh")]
6565
ThresholdTooHigh,
66+
#[msg("InvalidTransceiverProgram")]
67+
InvalidTransceiverProgram,
6668
}
6769

6870
impl From<ScalingError> for NTTError {

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

+23-13
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ pub fn set_peer(ctx: Context<SetPeer>, args: SetPeerArgs) -> Result<()> {
7777
Ok(())
7878
}
7979

80-
// * Register transceivers
80+
// * Transceiver registration
8181

8282
#[derive(Accounts)]
8383
pub struct RegisterTransceiver<'info> {
@@ -92,13 +92,16 @@ pub struct RegisterTransceiver<'info> {
9292
#[account(mut)]
9393
pub payer: Signer<'info>,
9494

95-
#[account(executable)]
95+
#[account(
96+
executable,
97+
constraint = transceiver.key() != Pubkey::default() @ NTTError::InvalidTransceiverProgram
98+
)]
9699
/// CHECK: transceiver is meant to be a transceiver program. Arguably a `Program` constraint could be
97100
/// used here that wraps the Transceiver account type.
98101
pub transceiver: UncheckedAccount<'info>,
99102

100103
#[account(
101-
init,
104+
init_if_needed,
102105
space = 8 + RegisteredTransceiver::INIT_SPACE,
103106
payer = payer,
104107
seeds = [RegisteredTransceiver::SEED_PREFIX, transceiver.key().as_ref()],
@@ -110,17 +113,23 @@ pub struct RegisterTransceiver<'info> {
110113
}
111114

112115
pub fn register_transceiver(ctx: Context<RegisterTransceiver>) -> Result<()> {
113-
let id = ctx.accounts.config.next_transceiver_id;
114-
ctx.accounts.config.next_transceiver_id += 1;
116+
// initialize registered transceiver with new id on init
117+
if ctx.accounts.registered_transceiver.transceiver_address == Pubkey::default() {
118+
let id = ctx.accounts.config.next_transceiver_id;
119+
ctx.accounts.config.next_transceiver_id += 1;
120+
ctx.accounts
121+
.registered_transceiver
122+
.set_inner(RegisteredTransceiver {
123+
bump: ctx.bumps.registered_transceiver,
124+
id,
125+
transceiver_address: ctx.accounts.transceiver.key(),
126+
});
127+
}
128+
115129
ctx.accounts
116-
.registered_transceiver
117-
.set_inner(RegisteredTransceiver {
118-
bump: ctx.bumps.registered_transceiver,
119-
id,
120-
transceiver_address: ctx.accounts.transceiver.key(),
121-
});
122-
123-
ctx.accounts.config.enabled_transceivers.set(id, true)?;
130+
.config
131+
.enabled_transceivers
132+
.set(ctx.accounts.registered_transceiver.id, true)?;
124133
Ok(())
125134
}
126135

@@ -242,6 +251,7 @@ pub fn set_paused(ctx: Context<SetPaused>, paused: bool) -> Result<()> {
242251
}
243252

244253
// * Set Threshold
254+
245255
#[derive(Accounts)]
246256
#[instruction(threshold: u8)]
247257
pub struct SetThreshold<'info> {

0 commit comments

Comments
 (0)