Skip to content

Commit 8abb41f

Browse files
committed
solana: add some more receive tests
1 parent 49d9546 commit 8abb41f

File tree

9 files changed

+542
-125
lines changed

9 files changed

+542
-125
lines changed

solana/programs/example-native-token-transfers/tests/cancel_flow.rs

+42-110
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,40 @@
22
#![feature(type_changing_struct_update)]
33

44
use anchor_lang::prelude::*;
5-
use common::setup::{TestData, OTHER_CHAIN, OTHER_MANAGER, OTHER_TRANSCEIVER, THIS_CHAIN};
5+
use common::setup::{TestData, OTHER_CHAIN};
66
use example_native_token_transfers::{
7-
error::NTTError,
87
instructions::{RedeemArgs, TransferArgs},
98
queue::{inbox::InboxRateLimit, outbox::OutboxRateLimit},
109
};
1110
use ntt_messages::{
1211
chain_id::ChainId, mode::Mode, ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage,
13-
transceiver::TransceiverMessage, transceivers::wormhole::WormholeTransceiver,
14-
trimmed_amount::TrimmedAmount,
1512
};
1613
use sdk::{
1714
accounts::{good_ntt, NTTAccounts},
1815
transceivers::wormhole::instructions::receive_message::ReceiveMessage,
1916
};
20-
use solana_program::instruction::InstructionError;
2117
use solana_program_test::*;
22-
use solana_sdk::{signature::Keypair, signer::Signer, transaction::TransactionError};
23-
use wormhole_sdk::{Address, Vaa};
18+
use solana_sdk::{signature::Keypair, signer::Signer};
19+
use wormhole_sdk::Address;
2420

2521
use crate::{
26-
common::submit::Submittable,
27-
sdk::instructions::transfer::{approve_token_authority, transfer},
28-
};
29-
use crate::{
30-
common::{query::GetAccountDataAnchor, setup::setup},
22+
common::{
23+
query::GetAccountDataAnchor,
24+
setup::{setup, OTHER_TRANSCEIVER},
25+
utils::make_transfer_message,
26+
},
3127
sdk::{
3228
instructions::{
33-
post_vaa::post_vaa,
3429
redeem::{redeem, Redeem},
3530
transfer::Transfer,
3631
},
3732
transceivers::wormhole::instructions::receive_message::receive_message,
3833
},
3934
};
35+
use crate::{
36+
common::{submit::Submittable, utils::post_vaa_helper},
37+
sdk::instructions::transfer::{approve_token_authority, transfer},
38+
};
4039

4140
pub mod common;
4241
pub mod sdk;
@@ -99,58 +98,6 @@ fn init_receive_message_accs(
9998
}
10099
}
101100

102-
async fn post_transfer_vaa(
103-
ctx: &mut ProgramTestContext,
104-
id: [u8; 32],
105-
amount: u64,
106-
// TODO: this is used for a negative testing of the recipient ntt_manager
107-
// address. this should not be done in the cancel flow tests, but instead a
108-
// dedicated receive transfer test suite
109-
recipient_ntt_manager: Option<&Pubkey>,
110-
recipient: &Keypair,
111-
) -> (Pubkey, NttManagerMessage<NativeTokenTransfer>) {
112-
let ntt_manager_message = NttManagerMessage {
113-
id,
114-
sender: [4u8; 32],
115-
payload: NativeTokenTransfer {
116-
amount: TrimmedAmount {
117-
amount,
118-
decimals: 9,
119-
},
120-
source_token: [3u8; 32],
121-
to_chain: ChainId { id: THIS_CHAIN },
122-
to: recipient.pubkey().to_bytes(),
123-
},
124-
};
125-
126-
let transceiver_message: TransceiverMessage<WormholeTransceiver, NativeTokenTransfer> =
127-
TransceiverMessage::new(
128-
OTHER_MANAGER,
129-
recipient_ntt_manager
130-
.map(|k| k.to_bytes())
131-
.unwrap_or_else(|| good_ntt.program().to_bytes()),
132-
ntt_manager_message.clone(),
133-
vec![],
134-
);
135-
136-
let vaa = Vaa {
137-
version: 1,
138-
guardian_set_index: 0,
139-
signatures: vec![],
140-
timestamp: 123232,
141-
nonce: 0,
142-
emitter_chain: OTHER_CHAIN.into(),
143-
emitter_address: Address(OTHER_TRANSCEIVER),
144-
sequence: 0,
145-
consistency_level: 0,
146-
payload: transceiver_message,
147-
};
148-
149-
let posted_vaa = post_vaa(&good_ntt.wormhole(), ctx, vaa).await;
150-
151-
(posted_vaa, ntt_manager_message)
152-
}
153-
154101
async fn outbound_capacity(ctx: &mut ProgramTestContext) -> u64 {
155102
let clock: Clock = ctx.banks_client.get_sysvar().await.unwrap();
156103
let rate_limit: OutboxRateLimit = ctx
@@ -174,8 +121,24 @@ async fn test_cancel() {
174121
let recipient = Keypair::new();
175122
let (mut ctx, test_data) = setup(Mode::Locking).await;
176123

177-
let (vaa0, msg0) = post_transfer_vaa(&mut ctx, [0u8; 32], 1000, None, &recipient).await;
178-
let (vaa1, msg1) = post_transfer_vaa(&mut ctx, [1u8; 32], 2000, None, &recipient).await;
124+
let msg0 = make_transfer_message(&good_ntt, [0u8; 32], 1000, &recipient.pubkey());
125+
let msg1 = make_transfer_message(&good_ntt, [1u8; 32], 2000, &recipient.pubkey());
126+
let vaa0 = post_vaa_helper(
127+
&good_ntt,
128+
OTHER_CHAIN.into(),
129+
Address(OTHER_TRANSCEIVER),
130+
msg0.clone(),
131+
&mut ctx,
132+
)
133+
.await;
134+
let vaa1 = post_vaa_helper(
135+
&good_ntt,
136+
OTHER_CHAIN.into(),
137+
Address(OTHER_TRANSCEIVER),
138+
msg1.clone(),
139+
&mut ctx,
140+
)
141+
.await;
179142

180143
let inbound_limit_before = inbound_capacity(&mut ctx).await;
181144
let outbound_limit_before = outbound_capacity(&mut ctx).await;
@@ -190,7 +153,12 @@ async fn test_cancel() {
190153

191154
redeem(
192155
&good_ntt,
193-
init_redeem_accs(&mut ctx, &test_data, OTHER_CHAIN, msg0),
156+
init_redeem_accs(
157+
&mut ctx,
158+
&test_data,
159+
OTHER_CHAIN,
160+
msg0.ntt_manager_payload.clone(),
161+
),
194162
RedeemArgs {},
195163
)
196164
.submit(&mut ctx)
@@ -241,7 +209,12 @@ async fn test_cancel() {
241209

242210
redeem(
243211
&good_ntt,
244-
init_redeem_accs(&mut ctx, &test_data, OTHER_CHAIN, msg1),
212+
init_redeem_accs(
213+
&mut ctx,
214+
&test_data,
215+
OTHER_CHAIN,
216+
msg1.ntt_manager_payload.clone(),
217+
),
245218
RedeemArgs {},
246219
)
247220
.submit(&mut ctx)
@@ -258,44 +231,3 @@ async fn test_cancel() {
258231
inbound_capacity(&mut ctx).await
259232
);
260233
}
261-
262-
// TODO: this should not live in this file, move to a dedicated receive test suite
263-
#[tokio::test]
264-
async fn test_wrong_recipient_ntt_manager() {
265-
let recipient = Keypair::new();
266-
let (mut ctx, test_data) = setup(Mode::Locking).await;
267-
268-
let (vaa0, msg0) = post_transfer_vaa(
269-
&mut ctx,
270-
[0u8; 32],
271-
1000,
272-
Some(&Pubkey::default()),
273-
&recipient,
274-
)
275-
.await;
276-
277-
receive_message(
278-
&good_ntt,
279-
init_receive_message_accs(&mut ctx, vaa0, OTHER_CHAIN, [0u8; 32]),
280-
)
281-
.submit(&mut ctx)
282-
.await
283-
.unwrap();
284-
285-
let err = redeem(
286-
&good_ntt,
287-
init_redeem_accs(&mut ctx, &test_data, OTHER_CHAIN, msg0),
288-
RedeemArgs {},
289-
)
290-
.submit(&mut ctx)
291-
.await
292-
.unwrap_err();
293-
294-
assert_eq!(
295-
err.unwrap(),
296-
TransactionError::InstructionError(
297-
0,
298-
InstructionError::Custom(NTTError::InvalidRecipientNttManager.into())
299-
)
300-
);
301-
}

solana/programs/example-native-token-transfers/tests/common/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ pub mod account_json_utils;
33
pub mod query;
44
pub mod setup;
55
pub mod submit;
6+
pub mod utils;

solana/programs/example-native-token-transfers/tests/common/setup.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ pub async fn setup_ntt(ctx: &mut ProgramTestContext, test_data: &TestData, mode:
215215
.unwrap();
216216

217217
set_peer(
218-
&GoodNTT {},
218+
&good_ntt,
219219
SetPeer {
220220
payer: ctx.payer.pubkey(),
221221
owner: test_data.program_owner.pubkey(),
@@ -268,8 +268,11 @@ pub async fn setup_accounts(ctx: &mut ProgramTestContext, program_owner: Keypair
268268
.await
269269
.unwrap();
270270

271-
let bad_user_token_account =
272-
get_associated_token_address_with_program_id(&user.pubkey(), &bad_mint.pubkey(), &Token::id());
271+
let bad_user_token_account = get_associated_token_address_with_program_id(
272+
&user.pubkey(),
273+
&bad_mint.pubkey(),
274+
&Token::id(),
275+
);
273276

274277
spl_associated_token_account::instruction::create_associated_token_account(
275278
&payer,
@@ -281,7 +284,6 @@ pub async fn setup_accounts(ctx: &mut ProgramTestContext, program_owner: Keypair
281284
.await
282285
.unwrap();
283286

284-
285287
spl_token::instruction::mint_to(
286288
&Token::id(),
287289
&mint.pubkey(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
use std::sync::atomic::AtomicU64;
2+
3+
use anchor_lang::AnchorSerialize;
4+
use ntt_messages::{
5+
chain_id::ChainId, ntt::NativeTokenTransfer, ntt_manager::NttManagerMessage,
6+
transceiver::TransceiverMessage, transceivers::wormhole::WormholeTransceiver,
7+
trimmed_amount::TrimmedAmount,
8+
};
9+
use solana_program::pubkey::Pubkey;
10+
use solana_program_test::ProgramTestContext;
11+
use wormhole_sdk::{Address, Chain, Vaa};
12+
13+
use crate::sdk::accounts::NTT;
14+
15+
use super::setup::{OTHER_MANAGER, THIS_CHAIN};
16+
use crate::sdk::instructions::post_vaa::post_vaa;
17+
18+
pub fn make_transfer_message(
19+
ntt: &NTT,
20+
id: [u8; 32],
21+
amount: u64,
22+
recipient: &Pubkey,
23+
) -> TransceiverMessage<WormholeTransceiver, NativeTokenTransfer> {
24+
let ntt_manager_message = NttManagerMessage {
25+
id,
26+
sender: [4u8; 32],
27+
payload: NativeTokenTransfer {
28+
amount: TrimmedAmount {
29+
amount,
30+
decimals: 9,
31+
},
32+
source_token: [3u8; 32],
33+
to_chain: ChainId { id: THIS_CHAIN },
34+
to: recipient.to_bytes(),
35+
},
36+
};
37+
38+
TransceiverMessage::new(
39+
OTHER_MANAGER,
40+
ntt.program().to_bytes(),
41+
ntt_manager_message.clone(),
42+
vec![],
43+
)
44+
}
45+
46+
pub async fn post_vaa_helper<A: AnchorSerialize + Clone>(
47+
ntt: &NTT,
48+
emitter_chain: Chain,
49+
emitter_address: Address,
50+
msg: A,
51+
ctx: &mut ProgramTestContext,
52+
) -> Pubkey {
53+
static I: AtomicU64 = AtomicU64::new(0);
54+
55+
let sequence = I.fetch_add(1, std::sync::atomic::Ordering::Acquire);
56+
57+
let vaa = Vaa {
58+
version: 1,
59+
guardian_set_index: 0,
60+
signatures: vec![],
61+
timestamp: 123232,
62+
nonce: 0,
63+
emitter_chain,
64+
emitter_address,
65+
sequence,
66+
consistency_level: 0,
67+
payload: msg,
68+
};
69+
70+
let posted_vaa = post_vaa(&ntt.wormhole(), ctx, vaa).await;
71+
72+
posted_vaa
73+
}

solana/programs/example-native-token-transfers/tests/governance.rs

-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ async fn transfer_ownership_to_gov_program(
122122
(vaa, inner_ix)
123123
}
124124

125-
126125
#[tokio::test]
127126
async fn test_governance() {
128127
let (mut ctx, test_data) = setup(Mode::Locking).await;

0 commit comments

Comments
 (0)