Skip to content

Commit

Permalink
solana: rename NativeTokenTransferConcrete, fixes #526
Browse files Browse the repository at this point in the history
  • Loading branch information
evan-gray committed Oct 4, 2024
1 parent 67df547 commit 5271959
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 32 deletions.
2 changes: 1 addition & 1 deletion solana/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ See the [NttManager](../docs/NttManager.md) doc for wire format details.

Modify [transfer.rs](./programs/example-native-token-transfers/src/transfer.rs) and replace the `EmptyPayload` with your own custom struct. See [ntt.rs](./modules/ntt-messages/src/ntt.rs) for an example. It is highly encouraged to use a 4-byte prefix for your payload.

The additional payload field should then have your custom struct available everywhere `NativeTokenTransferConcrete` is used. Due to typing, parsing, and account allocation restrictions, this implementation expects that _all_ `NativeTokenTransfer` payloads for your contract adhere to your custom struct definition.
The additional payload field should then have your custom struct available everywhere `NativeTokenTransfer<Payload>` is used. Due to typing, parsing, and account allocation restrictions, this implementation expects that _all_ `NativeTokenTransfer` payloads for your contract adhere to your custom struct definition.

You can then modify [release_outbound](./programs/example-native-token-transfers/src/transceivers/wormhole/instructions/release_outbound.rs) and [redeem](./programs/example-native-token-transfers/src/instructions/redeem.rs) to generate and process the additional payload.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use anchor_lang::prelude::*;
use anchor_spl::token_interface;
use ntt_messages::ntt_manager::NttManagerMessage;
use ntt_messages::{ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage};

use crate::{
bitmap::Bitmap,
Expand All @@ -14,7 +14,7 @@ use crate::{
rate_limit::RateLimitResult,
},
registered_transceiver::*,
transfer::NativeTokenTransferConcrete,
transfer::Payload,
};

#[derive(Accounts)]
Expand Down Expand Up @@ -45,7 +45,7 @@ pub struct Redeem<'info> {
owner = transceiver.transceiver_address,
)]
pub transceiver_message:
Account<'info, ValidatedTransceiverMessage<NativeTokenTransferConcrete>>,
Account<'info, ValidatedTransceiverMessage<NativeTokenTransfer<Payload>>>,

#[account(
constraint = config.enabled_transceivers.get(transceiver.id)? @ NTTError::DisabledTransceiver
Expand Down Expand Up @@ -105,7 +105,7 @@ pub struct RedeemArgs {}
pub fn redeem(ctx: Context<Redeem>, _args: RedeemArgs) -> Result<()> {
let accs = ctx.accounts;

let message: NttManagerMessage<NativeTokenTransferConcrete> =
let message: NttManagerMessage<NativeTokenTransfer<Payload>> =
accs.transceiver_message.message.ntt_manager_payload.clone();

// Calculate the scaled amount based on the appropriate decimal encoding for the token.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ use anchor_lang::prelude::*;

use ntt_messages::{
chain_id::ChainId,
ntt::NativeTokenTransfer,
transceiver::{TransceiverMessage, TransceiverMessageData},
transceivers::wormhole::WormholeTransceiver,
};
use wormhole_anchor_sdk::wormhole::PostedVaa;

use crate::{
config::*, error::NTTError, messages::ValidatedTransceiverMessage,
transceivers::accounts::peer::TransceiverPeer, transfer::NativeTokenTransferConcrete,
transceivers::accounts::peer::TransceiverPeer, transfer::Payload,
};

#[derive(Accounts)]
Expand Down Expand Up @@ -37,15 +38,15 @@ pub struct ReceiveMessage<'info> {
)]
pub vaa: Account<
'info,
PostedVaa<TransceiverMessage<WormholeTransceiver, NativeTokenTransferConcrete>>,
PostedVaa<TransceiverMessage<WormholeTransceiver, NativeTokenTransfer<Payload>>>,
>,

#[account(
init,
payer = payer,
space = 8 + ValidatedTransceiverMessage::<TransceiverMessageData<NativeTokenTransferConcrete>>::INIT_SPACE,
space = 8 + ValidatedTransceiverMessage::<TransceiverMessageData<NativeTokenTransfer<Payload>>>::INIT_SPACE,
seeds = [
ValidatedTransceiverMessage::<TransceiverMessageData<NativeTokenTransferConcrete>>::SEED_PREFIX,
ValidatedTransceiverMessage::<TransceiverMessageData<NativeTokenTransfer<Payload>>>::SEED_PREFIX,
vaa.emitter_chain().to_be_bytes().as_ref(),
vaa.message().ntt_manager_payload.id.as_ref(),
],
Expand All @@ -56,7 +57,7 @@ pub struct ReceiveMessage<'info> {
// attested to the transfer. Then we only release it if there's quorum.
// We would need to maybe_init this account in that case.
pub transceiver_message:
Account<'info, ValidatedTransceiverMessage<NativeTokenTransferConcrete>>,
Account<'info, ValidatedTransceiverMessage<NativeTokenTransfer<Payload>>>,

pub system_program: Program<'info, System>,
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
use anchor_lang::prelude::*;

use ntt_messages::{
ntt::EmptyPayload, ntt_manager::NttManagerMessage, transceiver::TransceiverMessage,
ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage, transceiver::TransceiverMessage,
transceivers::wormhole::WormholeTransceiver,
};

use crate::{
config::*, error::NTTError, queue::outbox::OutboxItem, registered_transceiver::*,
transceivers::wormhole::accounts::*, transfer::NativeTokenTransferConcrete,
transceivers::wormhole::accounts::*, transfer::Payload,
};

#[derive(Accounts)]
Expand Down Expand Up @@ -66,20 +66,20 @@ pub fn release_outbound(ctx: Context<ReleaseOutbound>, args: ReleaseOutboundArgs
}

assert!(accs.outbox_item.released.get(accs.transceiver.id)?);
let message: TransceiverMessage<WormholeTransceiver, NativeTokenTransferConcrete> =
let message: TransceiverMessage<WormholeTransceiver, NativeTokenTransfer<Payload>> =
TransceiverMessage::new(
// TODO: should we just put the ntt id here statically?
accs.outbox_item.to_account_info().owner.to_bytes(),
accs.outbox_item.recipient_ntt_manager,
NttManagerMessage {
id: accs.outbox_item.key().to_bytes(),
sender: accs.outbox_item.sender.to_bytes(),
payload: NativeTokenTransferConcrete {
payload: NativeTokenTransfer {
amount: accs.outbox_item.amount,
source_token: accs.config.mint.to_bytes(),
to: accs.outbox_item.recipient_address,
to_chain: accs.outbox_item.recipient_chain,
additional_payload: EmptyPayload {},
additional_payload: Payload {},
},
},
vec![],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
use ntt_messages::{ntt::EmptyPayload, ntt::NativeTokenTransfer};
use ntt_messages::ntt::EmptyPayload;

pub type NativeTokenTransferConcrete = NativeTokenTransfer<EmptyPayload>;
pub type Payload = EmptyPayload;
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ use example_native_token_transfers::{
error::NTTError,
instructions::{RedeemArgs, TransferArgs},
queue::{inbox::InboxRateLimit, outbox::OutboxRateLimit},
transfer::NativeTokenTransferConcrete,
transfer::Payload,
};
use ntt_messages::{
chain_id::ChainId, mode::Mode, ntt::EmptyPayload, ntt_manager::NttManagerMessage,
chain_id::ChainId, mode::Mode, ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage,
transceiver::TransceiverMessage, transceivers::wormhole::WormholeTransceiver,
trimmed_amount::TrimmedAmount,
};
Expand Down Expand Up @@ -69,7 +69,7 @@ fn init_redeem_accs(
ctx: &mut ProgramTestContext,
test_data: &TestData,
chain_id: u16,
ntt_manager_message: NttManagerMessage<NativeTokenTransferConcrete>,
ntt_manager_message: NttManagerMessage<NativeTokenTransfer<Payload>>,
) -> Redeem {
Redeem {
payer: ctx.payer.pubkey(),
Expand Down Expand Up @@ -110,23 +110,23 @@ async fn post_transfer_vaa(
// dedicated receive transfer test suite
recipient_ntt_manager: Option<&Pubkey>,
recipient: &Keypair,
) -> (Pubkey, NttManagerMessage<NativeTokenTransferConcrete>) {
) -> (Pubkey, NttManagerMessage<NativeTokenTransfer<Payload>>) {
let ntt_manager_message = NttManagerMessage {
id,
sender: [4u8; 32],
payload: NativeTokenTransferConcrete {
payload: NativeTokenTransfer {
amount: TrimmedAmount {
amount,
decimals: 9,
},
source_token: [3u8; 32],
to_chain: ChainId { id: THIS_CHAIN },
to: recipient.pubkey().to_bytes(),
additional_payload: EmptyPayload {},
additional_payload: Payload {},
},
};

let transceiver_message: TransceiverMessage<WormholeTransceiver, NativeTokenTransferConcrete> =
let transceiver_message: TransceiverMessage<WormholeTransceiver, NativeTokenTransfer<Payload>> =
TransceiverMessage::new(
OTHER_MANAGER,
recipient_ntt_manager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ use example_native_token_transfers::{
outbox::OutboxRateLimit,
},
registered_transceiver::RegisteredTransceiver,
transfer::NativeTokenTransferConcrete,
transfer::Payload,
SESSION_AUTHORITY_SEED, TOKEN_AUTHORITY_SEED,
};
use ntt_messages::ntt_manager::NttManagerMessage;
use ntt_messages::{ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage};
use sha3::{Digest, Keccak256};
use wormhole_anchor_sdk::wormhole;
use wormhole_io::TypePrefixedPayload;
Expand Down Expand Up @@ -120,7 +120,7 @@ impl NTT {
pub fn inbox_item(
&self,
chain: u16,
ntt_manager_message: NttManagerMessage<NativeTokenTransferConcrete>,
ntt_manager_message: NttManagerMessage<NativeTokenTransfer<Payload>>,
) -> Pubkey {
let mut hasher = Keccak256::new();
hasher.update(chain.to_be_bytes());
Expand Down
10 changes: 5 additions & 5 deletions solana/programs/example-native-token-transfers/tests/transfer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ use example_native_token_transfers::{
instructions::TransferArgs,
queue::outbox::{OutboxItem, OutboxRateLimit},
transceivers::wormhole::ReleaseOutboundArgs,
transfer::NativeTokenTransferConcrete,
transfer::Payload,
};
use ntt_messages::{
chain_id::ChainId, mode::Mode, ntt::EmptyPayload, ntt_manager::NttManagerMessage,
chain_id::ChainId, mode::Mode, ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage,
transceiver::TransceiverMessage, transceivers::wormhole::WormholeTransceiver,
trimmed_amount::TrimmedAmount,
};
Expand Down Expand Up @@ -195,7 +195,7 @@ async fn test_transfer(ctx: &mut ProgramTestContext, test_data: &TestData, mode:
// They are identical modulo the discriminator, which we just skip by using
// the unchecked deserialiser.
// TODO: update the sdk to export PostedMessage
let msg: PostedVaa<TransceiverMessage<WormholeTransceiver, NativeTokenTransferConcrete>> =
let msg: PostedVaa<TransceiverMessage<WormholeTransceiver, NativeTokenTransfer<Payload>>> =
ctx.get_account_data_anchor_unchecked(wh_message).await;

let transceiver_message = msg.data();
Expand All @@ -208,15 +208,15 @@ async fn test_transfer(ctx: &mut ProgramTestContext, test_data: &TestData, mode:
NttManagerMessage {
id: outbox_item.pubkey().to_bytes(),
sender: test_data.user.pubkey().to_bytes(),
payload: NativeTokenTransferConcrete {
payload: NativeTokenTransfer {
amount: TrimmedAmount {
amount: 1,
decimals: 7
},
source_token: test_data.mint.to_bytes(),
to: [1u8; 32],
to_chain: ChainId { id: 2 },
additional_payload: EmptyPayload {}
additional_payload: Payload {}
}
},
vec![]
Expand Down

0 comments on commit 5271959

Please sign in to comment.