diff --git a/solana/programs/example-native-token-transfers/src/error.rs b/solana/programs/example-native-token-transfers/src/error.rs index 17bb26610..1ab9f508a 100644 --- a/solana/programs/example-native-token-transfers/src/error.rs +++ b/solana/programs/example-native-token-transfers/src/error.rs @@ -19,6 +19,8 @@ pub enum NTTError { InvalidRecipientNttManager, #[msg("TransferAlreadyRedeemed")] TransferAlreadyRedeemed, + #[msg("TransferCannotBeRedeemed")] + TransferCannotBeRedeemed, #[msg("TransferNotApproved")] TransferNotApproved, #[msg("MessageAlreadySent")] diff --git a/solana/programs/example-native-token-transfers/src/instructions/redeem.rs b/solana/programs/example-native-token-transfers/src/instructions/redeem.rs index c046dfbbd..43b71b2b4 100644 --- a/solana/programs/example-native-token-transfers/src/instructions/redeem.rs +++ b/solana/programs/example-native-token-transfers/src/instructions/redeem.rs @@ -134,7 +134,7 @@ pub fn redeem(ctx: Context, _args: RedeemArgs) -> Result<()> { RateLimitResult::Delayed(release_timestamp) => release_timestamp, }; - accs.inbox_item.release_status = ReleaseStatus::ReleaseAfter(release_timestamp); + accs.inbox_item.release_after(release_timestamp)?; Ok(()) } diff --git a/solana/programs/example-native-token-transfers/src/queue/inbox.rs b/solana/programs/example-native-token-transfers/src/queue/inbox.rs index 947058e8d..9de3b1c22 100644 --- a/solana/programs/example-native-token-transfers/src/queue/inbox.rs +++ b/solana/programs/example-native-token-transfers/src/queue/inbox.rs @@ -45,6 +45,14 @@ impl InboxItem { ReleaseStatus::Released => Err(NTTError::TransferAlreadyRedeemed.into()), } } + + pub fn release_after(&mut self, release_timestamp: i64) -> Result<()> { + if self.release_status != ReleaseStatus::NotApproved { + return Err(NTTError::TransferCannotBeRedeemed.into()); + }; + self.release_status = ReleaseStatus::ReleaseAfter(release_timestamp); + Ok(()) + } } /// Inbound rate limit per chain.