integration.rs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  1. #![allow(warnings)]
  2. use borsh::BorshSerialize;
  3. use byteorder::{
  4. BigEndian,
  5. WriteBytesExt,
  6. };
  7. use hex_literal::hex;
  8. use rand::Rng;
  9. use secp256k1::{
  10. Message as Secp256k1Message,
  11. PublicKey,
  12. SecretKey,
  13. };
  14. use sha3::Digest;
  15. use solana_client::rpc_client::RpcClient;
  16. use solana_program::{
  17. borsh::try_from_slice_unchecked,
  18. hash,
  19. instruction::{
  20. AccountMeta,
  21. Instruction,
  22. },
  23. program_pack::Pack,
  24. pubkey::Pubkey,
  25. system_instruction::{
  26. self,
  27. create_account,
  28. },
  29. system_program,
  30. sysvar,
  31. };
  32. use solana_sdk::{
  33. signature::{
  34. read_keypair_file,
  35. Keypair,
  36. Signer,
  37. },
  38. transaction::Transaction,
  39. };
  40. use solitaire::{
  41. processors::seeded::Seeded,
  42. AccountState,
  43. };
  44. use std::{
  45. convert::TryInto,
  46. io::{
  47. Cursor,
  48. Write,
  49. },
  50. time::{
  51. Duration,
  52. SystemTime,
  53. },
  54. };
  55. use bridge::{
  56. accounts::{
  57. Bridge,
  58. BridgeConfig,
  59. BridgeData,
  60. FeeCollector,
  61. GuardianSet,
  62. GuardianSetData,
  63. GuardianSetDerivationData,
  64. MessageData,
  65. PostedVAA,
  66. PostedVAAData,
  67. PostedVAADerivationData,
  68. SequenceTracker,
  69. SignatureSet,
  70. SignatureSetData,
  71. },
  72. instruction,
  73. instructions::hash_vaa,
  74. types::{
  75. ConsistencyLevel,
  76. GovernancePayloadGuardianSetChange,
  77. GovernancePayloadSetMessageFee,
  78. GovernancePayloadTransferFees,
  79. GovernancePayloadUpgrade,
  80. },
  81. Initialize,
  82. PostVAA,
  83. PostVAAData,
  84. SerializeGovernancePayload,
  85. Signature,
  86. };
  87. use primitive_types::U256;
  88. use solana_sdk::hash::hashv;
  89. mod common;
  90. const GOVERNANCE_KEY: [u8; 64] = [
  91. 240, 133, 120, 113, 30, 67, 38, 184, 197, 72, 234, 99, 241, 21, 58, 225, 41, 157, 171, 44, 196,
  92. 163, 134, 236, 92, 148, 110, 68, 127, 114, 177, 0, 173, 253, 199, 9, 242, 142, 201, 174, 108,
  93. 197, 18, 102, 115, 0, 31, 205, 127, 188, 191, 56, 171, 228, 20, 247, 149, 170, 141, 231, 147,
  94. 88, 97, 199,
  95. ];
  96. struct Context {
  97. public: Vec<[u8; 20]>,
  98. secret: Vec<SecretKey>,
  99. seq: Sequencer,
  100. }
  101. /// Small helper to track and provide sequences during tests. This is in particular needed for
  102. /// guardian operations that require them for derivations.
  103. struct Sequencer {
  104. sequences: std::collections::HashMap<[u8; 32], u64>,
  105. }
  106. impl Sequencer {
  107. fn next(&mut self, emitter: [u8; 32]) -> u64 {
  108. let entry = self.sequences.entry(emitter).or_insert(0);
  109. *entry += 1;
  110. *entry - 1
  111. }
  112. fn peek(&mut self, emitter: [u8; 32]) -> u64 {
  113. *self.sequences.entry(emitter).or_insert(0)
  114. }
  115. }
  116. #[test]
  117. fn run_integration_tests() {
  118. let (public_keys, secret_keys) = common::generate_keys(6);
  119. let mut context = Context {
  120. public: public_keys,
  121. secret: secret_keys,
  122. seq: Sequencer {
  123. sequences: std::collections::HashMap::new(),
  124. },
  125. };
  126. // Initialize the bridge and verify the bridges state.
  127. test_initialize(&mut context);
  128. // Tests are currently unhygienic as It's difficult to wrap `solana-test-validator` within the
  129. // integration tests so for now we work around it by simply chain-calling our tests.
  130. test_bridge_messages(&mut context);
  131. test_foreign_bridge_messages(&mut context);
  132. test_invalid_emitter(&mut context);
  133. test_duplicate_messages_fail(&mut context);
  134. test_guardian_set_change(&mut context);
  135. test_guardian_set_change_fails(&mut context);
  136. test_set_fees(&mut context);
  137. test_set_fees_fails(&mut context);
  138. test_free_fees(&mut context);
  139. test_transfer_fees(&mut context);
  140. test_transfer_fees_fails(&mut context);
  141. test_transfer_too_much(&mut context);
  142. test_transfer_total_fails(&mut context);
  143. }
  144. fn test_initialize(context: &mut Context) {
  145. let (ref payer, ref client, ref program) = common::setup();
  146. // Use a timestamp from a few seconds earlier for testing to simulate thread::sleep();
  147. let now = std::time::SystemTime::now()
  148. .duration_since(std::time::UNIX_EPOCH)
  149. .unwrap()
  150. .as_secs()
  151. - 10;
  152. common::initialize(client, program, payer, &*context.public.clone(), 500);
  153. common::sync(client, payer);
  154. // Verify the initial bridge state is as expected.
  155. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  156. let guardian_set_key = GuardianSet::<'_, { AccountState::Uninitialized }>::key(
  157. &GuardianSetDerivationData { index: 0 },
  158. &program,
  159. );
  160. // Fetch account states.
  161. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  162. let guardian_set: GuardianSetData = common::get_account_data(client, &guardian_set_key);
  163. // Bridge Config should be as expected.
  164. assert_eq!(bridge.guardian_set_index, 0);
  165. assert_eq!(bridge.config.guardian_set_expiration_time, 2_000_000_000);
  166. assert_eq!(bridge.config.fee, 500);
  167. // Guardian set account must also be as expected.
  168. assert_eq!(guardian_set.index, 0);
  169. assert_eq!(guardian_set.keys, context.public);
  170. assert!(guardian_set.creation_time as u64 > now);
  171. }
  172. fn test_bridge_messages(context: &mut Context) {
  173. let (ref payer, ref client, ref program) = common::setup();
  174. // Data/Nonce used for emitting a message we want to prove exists. Run this twice to make sure
  175. // that duplicate data does not clash.
  176. let message = [0u8; 32].to_vec();
  177. let emitter = Keypair::new();
  178. for _ in 0..2 {
  179. let nonce = rand::thread_rng().gen();
  180. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  181. // Post the message, publishing the data for guardian consumption.
  182. let message_key = common::post_message(
  183. client,
  184. program,
  185. payer,
  186. &emitter,
  187. nonce,
  188. message.clone(),
  189. 10_000,
  190. )
  191. .unwrap();
  192. // Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
  193. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  194. let signature_set =
  195. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  196. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  197. common::sync(client, payer);
  198. // Fetch chain accounts to verify state.
  199. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  200. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  201. // Verify on chain Message
  202. assert_eq!(posted_message.0.vaa_version, 0);
  203. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  204. assert_eq!(posted_message.0.nonce, nonce);
  205. assert_eq!(posted_message.0.sequence, sequence);
  206. assert_eq!(posted_message.0.emitter_chain, 1);
  207. assert_eq!(posted_message.0.payload, message);
  208. assert_eq!(
  209. posted_message.0.emitter_address,
  210. emitter.pubkey().to_bytes()
  211. );
  212. // Verify on chain Signatures
  213. assert_eq!(signatures.hash, body);
  214. assert_eq!(signatures.guardian_set_index, 0);
  215. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  216. assert_eq!(*signature, true);
  217. }
  218. }
  219. // Prepare another message with no data in its message to confirm it succeeds.
  220. let nonce = rand::thread_rng().gen();
  221. let message = b"".to_vec();
  222. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  223. // Post the message, publishing the data for guardian consumption.
  224. let message_key = common::post_message(
  225. client,
  226. program,
  227. payer,
  228. &emitter,
  229. nonce,
  230. message.clone(),
  231. 10_000,
  232. )
  233. .unwrap();
  234. // Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
  235. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  236. let signature_set =
  237. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  238. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  239. common::sync(client, payer);
  240. // Fetch chain accounts to verify state.
  241. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  242. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  243. // Verify on chain Message
  244. assert_eq!(posted_message.0.vaa_version, 0);
  245. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  246. assert_eq!(posted_message.0.nonce, nonce);
  247. assert_eq!(posted_message.0.sequence, sequence);
  248. assert_eq!(posted_message.0.emitter_chain, 1);
  249. assert_eq!(posted_message.0.payload, message);
  250. assert_eq!(
  251. posted_message.0.emitter_address,
  252. emitter.pubkey().to_bytes()
  253. );
  254. // Verify on chain Signatures
  255. assert_eq!(signatures.hash, body);
  256. assert_eq!(signatures.guardian_set_index, 0);
  257. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  258. assert_eq!(*signature, true);
  259. }
  260. }
  261. fn test_invalid_emitter(context: &mut Context) {
  262. let (ref payer, ref client, ref program) = common::setup();
  263. // Generate a message we want to persist.
  264. let message = [0u8; 32].to_vec();
  265. let emitter = Keypair::new();
  266. let nonce = rand::thread_rng().gen();
  267. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  268. let fee_collector = FeeCollector::key(None, &program);
  269. let msg_account = Keypair::new();
  270. // Manually send a message that isn't signed by the emitter, which should be rejected to
  271. // prevent fraudulant transactions sent on behalf of an emitter.
  272. let mut instruction = bridge::instructions::post_message(
  273. *program,
  274. payer.pubkey(),
  275. emitter.pubkey(),
  276. msg_account.pubkey(),
  277. nonce,
  278. message,
  279. ConsistencyLevel::Confirmed,
  280. )
  281. .unwrap();
  282. // Modify account list to not require the emitter signs.
  283. instruction.accounts[2].is_signer = false;
  284. // Executing this should fail.
  285. assert!(common::execute(
  286. client,
  287. payer,
  288. &[payer],
  289. &[
  290. system_instruction::transfer(&payer.pubkey(), &fee_collector, 10_000),
  291. instruction,
  292. ],
  293. solana_sdk::commitment_config::CommitmentConfig::processed(),
  294. )
  295. .is_err());
  296. }
  297. fn test_duplicate_messages_fail(context: &mut Context) {
  298. let (ref payer, ref client, ref program) = common::setup();
  299. // We'll use the following nonce/message/emitter/sequence twice.
  300. let nonce = rand::thread_rng().gen();
  301. let message = [0u8; 32].to_vec();
  302. let emitter = Keypair::new();
  303. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  304. // Post the message, publishing the data for guardian consumption.
  305. let message_key = common::post_message(
  306. client,
  307. program,
  308. payer,
  309. &emitter,
  310. nonce,
  311. message.clone(),
  312. 10_000,
  313. )
  314. .unwrap();
  315. // Second should fail due to duplicate derivations.
  316. assert!(common::post_message(
  317. client,
  318. program,
  319. payer,
  320. &emitter,
  321. nonce,
  322. message.clone(),
  323. 10_000,
  324. )
  325. .is_err());
  326. }
  327. fn test_guardian_set_change(context: &mut Context) {
  328. // Initialize a wormhole bridge on Solana to test with.
  329. let (ref payer, ref client, ref program) = common::setup();
  330. // Use a timestamp from a few seconds earlier for testing to simulate thread::sleep();
  331. let now = std::time::SystemTime::now()
  332. .duration_since(std::time::UNIX_EPOCH)
  333. .unwrap()
  334. .as_secs()
  335. - 10;
  336. // Upgrade the guardian set with a new set of guardians.
  337. let (new_public_keys, new_secret_keys) = common::generate_keys(1);
  338. let nonce = rand::thread_rng().gen();
  339. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  340. println!("{}", emitter.pubkey().to_string());
  341. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  342. let message = GovernancePayloadGuardianSetChange {
  343. new_guardian_set_index: 1,
  344. new_guardian_set: new_public_keys.clone(),
  345. }
  346. .try_to_vec()
  347. .unwrap();
  348. let message_key = common::post_message(
  349. client,
  350. program,
  351. payer,
  352. &emitter,
  353. nonce,
  354. message.clone(),
  355. 10_000,
  356. )
  357. .unwrap();
  358. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  359. let signature_set =
  360. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  361. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  362. common::upgrade_guardian_set(
  363. client,
  364. program,
  365. payer,
  366. message_key,
  367. emitter.pubkey(),
  368. 0,
  369. 1,
  370. sequence,
  371. )
  372. .unwrap();
  373. common::sync(client, payer);
  374. // Derive keys for accounts we want to check.
  375. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  376. let guardian_set_key = GuardianSet::<'_, { AccountState::Uninitialized }>::key(
  377. &GuardianSetDerivationData { index: 1 },
  378. &program,
  379. );
  380. // Fetch account states.
  381. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  382. let guardian_set: GuardianSetData = common::get_account_data(client, &guardian_set_key);
  383. // Confirm the bridge now has a new guardian set, and no other fields have shifted.
  384. assert_eq!(bridge.guardian_set_index, 1);
  385. assert_eq!(bridge.config.guardian_set_expiration_time, 2_000_000_000);
  386. assert_eq!(bridge.config.fee, 500);
  387. // Verify Created Guardian Set
  388. assert_eq!(guardian_set.index, 1);
  389. assert_eq!(guardian_set.keys, new_public_keys);
  390. assert!(guardian_set.creation_time as u64 > now);
  391. // Submit the message a second time with a new nonce.
  392. let nonce = rand::thread_rng().gen();
  393. let message_key = common::post_message(
  394. client,
  395. program,
  396. payer,
  397. &emitter,
  398. nonce,
  399. message.clone(),
  400. 10_000,
  401. )
  402. .unwrap();
  403. context.public = new_public_keys;
  404. context.secret = new_secret_keys;
  405. // Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
  406. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  407. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  408. let signature_set =
  409. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  410. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  411. common::sync(client, payer);
  412. // Fetch chain accounts to verify state.
  413. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  414. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  415. // Verify on chain Message
  416. assert_eq!(posted_message.0.vaa_version, 0);
  417. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  418. assert_eq!(posted_message.0.nonce, nonce);
  419. assert_eq!(posted_message.0.sequence, sequence);
  420. assert_eq!(posted_message.0.emitter_chain, 1);
  421. assert_eq!(posted_message.0.payload, message);
  422. assert_eq!(
  423. posted_message.0.emitter_address,
  424. emitter.pubkey().to_bytes()
  425. );
  426. // Verify on chain Signatures
  427. assert_eq!(signatures.hash, body);
  428. assert_eq!(signatures.guardian_set_index, 1);
  429. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  430. assert_eq!(*signature, true);
  431. }
  432. }
  433. fn test_guardian_set_change_fails(context: &mut Context) {
  434. // Initialize a wormhole bridge on Solana to test with.
  435. let (ref payer, ref client, ref program) = common::setup();
  436. // Use a random emitter key to confirm the bridge rejects transactions from non-governance key.
  437. let emitter = Keypair::new();
  438. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  439. // Upgrade the guardian set with a new set of guardians.
  440. let (new_public_keys, new_secret_keys) = common::generate_keys(6);
  441. let nonce = rand::thread_rng().gen();
  442. let message = GovernancePayloadGuardianSetChange {
  443. new_guardian_set_index: 2,
  444. new_guardian_set: new_public_keys.clone(),
  445. }
  446. .try_to_vec()
  447. .unwrap();
  448. let message_key = common::post_message(
  449. client,
  450. program,
  451. payer,
  452. &emitter,
  453. nonce,
  454. message.clone(),
  455. 10_000,
  456. )
  457. .unwrap();
  458. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  459. assert!(common::upgrade_guardian_set(
  460. client,
  461. program,
  462. payer,
  463. message_key,
  464. emitter.pubkey(),
  465. 1,
  466. 2,
  467. sequence,
  468. )
  469. .is_err());
  470. }
  471. fn test_set_fees(context: &mut Context) {
  472. // Initialize a wormhole bridge on Solana to test with.
  473. let (ref payer, ref client, ref program) = common::setup();
  474. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  475. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  476. let nonce = rand::thread_rng().gen();
  477. let message = GovernancePayloadSetMessageFee {
  478. fee: U256::from(100),
  479. }
  480. .try_to_vec()
  481. .unwrap();
  482. let message_key = common::post_message(
  483. client,
  484. program,
  485. payer,
  486. &emitter,
  487. nonce,
  488. message.clone(),
  489. 10_000,
  490. )
  491. .unwrap();
  492. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  493. let signature_set =
  494. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  495. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  496. common::set_fees(
  497. client,
  498. program,
  499. payer,
  500. message_key,
  501. emitter.pubkey(),
  502. sequence,
  503. )
  504. .unwrap();
  505. common::sync(client, payer);
  506. // Fetch Bridge to check on-state value.
  507. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  508. let fee_collector = FeeCollector::key(None, &program);
  509. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  510. assert_eq!(bridge.config.fee, 100);
  511. // Check that posting a new message fails with too small a fee.
  512. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  513. let emitter = Keypair::new();
  514. let nonce = rand::thread_rng().gen();
  515. let message = [0u8; 32].to_vec();
  516. assert!(
  517. common::post_message(client, program, payer, &emitter, nonce, message.clone(), 50).is_err()
  518. );
  519. common::sync(client, payer);
  520. assert_eq!(
  521. client.get_account(&fee_collector).unwrap().lamports,
  522. account_balance,
  523. );
  524. // And succeeds with the new.
  525. let emitter = Keypair::new();
  526. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  527. let nonce = rand::thread_rng().gen();
  528. let message = [0u8; 32].to_vec();
  529. let message_key = common::post_message(
  530. client,
  531. program,
  532. payer,
  533. &emitter,
  534. nonce,
  535. message.clone(),
  536. 100,
  537. )
  538. .unwrap();
  539. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  540. let signature_set =
  541. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  542. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  543. common::sync(client, payer);
  544. // Verify that the fee collector was paid.
  545. assert_eq!(
  546. client.get_account(&fee_collector).unwrap().lamports,
  547. account_balance + 100,
  548. );
  549. // And that the new message is on chain.
  550. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  551. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  552. // Verify on chain Message
  553. assert_eq!(posted_message.0.vaa_version, 0);
  554. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  555. assert_eq!(posted_message.0.nonce, nonce);
  556. assert_eq!(posted_message.0.sequence, sequence);
  557. assert_eq!(posted_message.0.emitter_chain, 1);
  558. assert_eq!(posted_message.0.payload, message);
  559. assert_eq!(
  560. posted_message.0.emitter_address,
  561. emitter.pubkey().to_bytes()
  562. );
  563. // Verify on chain Signatures
  564. assert_eq!(signatures.hash, body);
  565. assert_eq!(signatures.guardian_set_index, 1);
  566. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  567. assert_eq!(*signature, true);
  568. }
  569. }
  570. fn test_set_fees_fails(context: &mut Context) {
  571. // Initialize a wormhole bridge on Solana to test with.
  572. let (ref payer, ref client, ref program) = common::setup();
  573. // Use a random key to confirm only the governance key is respected.
  574. let emitter = Keypair::new();
  575. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  576. let nonce = rand::thread_rng().gen();
  577. let message = GovernancePayloadSetMessageFee {
  578. fee: U256::from(100),
  579. }
  580. .try_to_vec()
  581. .unwrap();
  582. let message_key = common::post_message(
  583. client,
  584. program,
  585. payer,
  586. &emitter,
  587. nonce,
  588. message.clone(),
  589. 10_000,
  590. )
  591. .unwrap();
  592. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  593. let signature_set =
  594. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  595. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  596. assert!(common::set_fees(
  597. client,
  598. program,
  599. payer,
  600. message_key,
  601. emitter.pubkey(),
  602. sequence,
  603. )
  604. .is_err());
  605. common::sync(client, payer);
  606. }
  607. fn test_free_fees(context: &mut Context) {
  608. // Initialize a wormhole bridge on Solana to test with.
  609. let (ref payer, ref client, ref program) = common::setup();
  610. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  611. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  612. // Set Fees to 0.
  613. let nonce = rand::thread_rng().gen();
  614. let message = GovernancePayloadSetMessageFee { fee: U256::from(0) }
  615. .try_to_vec()
  616. .unwrap();
  617. let message_key = common::post_message(
  618. client,
  619. program,
  620. payer,
  621. &emitter,
  622. nonce,
  623. message.clone(),
  624. 10_000,
  625. )
  626. .unwrap();
  627. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  628. let signature_set =
  629. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  630. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  631. common::set_fees(
  632. client,
  633. program,
  634. payer,
  635. message_key,
  636. emitter.pubkey(),
  637. sequence,
  638. )
  639. .unwrap();
  640. common::sync(client, payer);
  641. // Fetch Bridge to check on-state value.
  642. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  643. let fee_collector = FeeCollector::key(None, &program);
  644. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  645. assert_eq!(bridge.config.fee, 0);
  646. // Check that posting a new message is free.
  647. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  648. let emitter = Keypair::new();
  649. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  650. let nonce = rand::thread_rng().gen();
  651. let message = [0u8; 32].to_vec();
  652. let message_key =
  653. common::post_message(client, program, payer, &emitter, nonce, message.clone(), 0).unwrap();
  654. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  655. let signature_set =
  656. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  657. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  658. common::sync(client, payer);
  659. // Verify that the fee collector was paid.
  660. assert_eq!(
  661. client.get_account(&fee_collector).unwrap().lamports,
  662. account_balance,
  663. );
  664. // And that the new message is on chain.
  665. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  666. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  667. // Verify on chain Message
  668. assert_eq!(posted_message.0.vaa_version, 0);
  669. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  670. assert_eq!(posted_message.0.nonce, nonce);
  671. assert_eq!(posted_message.0.sequence, sequence);
  672. assert_eq!(posted_message.0.emitter_chain, 1);
  673. assert_eq!(posted_message.0.payload, message);
  674. assert_eq!(
  675. posted_message.0.emitter_address,
  676. emitter.pubkey().to_bytes()
  677. );
  678. // Verify on chain Signatures
  679. assert_eq!(signatures.hash, body);
  680. assert_eq!(signatures.guardian_set_index, 1);
  681. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  682. assert_eq!(*signature, true);
  683. }
  684. }
  685. fn test_transfer_fees(context: &mut Context) {
  686. // Initialize a wormhole bridge on Solana to test with.
  687. let (ref payer, ref client, ref program) = common::setup();
  688. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  689. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  690. let recipient = Keypair::new();
  691. let nonce = rand::thread_rng().gen();
  692. let message = GovernancePayloadTransferFees {
  693. amount: 100.into(),
  694. to: payer.pubkey().to_bytes(),
  695. }
  696. .try_to_vec()
  697. .unwrap();
  698. // Fetch accounts for chain state checking.
  699. let fee_collector = FeeCollector::key(None, &program);
  700. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  701. let message_key = common::post_message(
  702. client,
  703. program,
  704. payer,
  705. &emitter,
  706. nonce,
  707. message.clone(),
  708. 10_000,
  709. )
  710. .unwrap();
  711. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  712. let signature_set =
  713. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  714. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  715. common::transfer_fees(
  716. client,
  717. program,
  718. payer,
  719. message_key,
  720. emitter.pubkey(),
  721. payer.pubkey(),
  722. sequence,
  723. )
  724. .unwrap();
  725. common::sync(client, payer);
  726. }
  727. fn test_transfer_fees_fails(context: &mut Context) {
  728. // Initialize a wormhole bridge on Solana to test with.
  729. let (ref payer, ref client, ref program) = common::setup();
  730. // Use an invalid emitter.
  731. let emitter = Keypair::new();
  732. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  733. let recipient = Keypair::new();
  734. let nonce = rand::thread_rng().gen();
  735. let message = GovernancePayloadTransferFees {
  736. amount: 100.into(),
  737. to: payer.pubkey().to_bytes(),
  738. }
  739. .try_to_vec()
  740. .unwrap();
  741. // Fetch accounts for chain state checking.
  742. let fee_collector = FeeCollector::key(None, &program);
  743. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  744. let message_key = common::post_message(
  745. client,
  746. program,
  747. payer,
  748. &emitter,
  749. nonce,
  750. message.clone(),
  751. 10_000,
  752. )
  753. .unwrap();
  754. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  755. let signature_set =
  756. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  757. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  758. assert!(common::transfer_fees(
  759. client,
  760. program,
  761. payer,
  762. message_key,
  763. emitter.pubkey(),
  764. payer.pubkey(),
  765. sequence,
  766. )
  767. .is_err());
  768. }
  769. fn test_transfer_too_much(context: &mut Context) {
  770. // Initialize a wormhole bridge on Solana to test with.
  771. let (ref payer, ref client, ref program) = common::setup();
  772. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  773. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  774. let recipient = Keypair::new();
  775. let nonce = rand::thread_rng().gen();
  776. let message = GovernancePayloadTransferFees {
  777. amount: 100_000_000_000u64.into(),
  778. to: payer.pubkey().to_bytes(),
  779. }
  780. .try_to_vec()
  781. .unwrap();
  782. // Fetch accounts for chain state checking.
  783. let fee_collector = FeeCollector::key(None, &program);
  784. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  785. let message_key = common::post_message(
  786. client,
  787. program,
  788. payer,
  789. &emitter,
  790. nonce,
  791. message.clone(),
  792. 10_000,
  793. )
  794. .unwrap();
  795. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  796. let signature_set =
  797. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  798. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  799. // Should fail to transfer.
  800. assert!(common::transfer_fees(
  801. client,
  802. program,
  803. payer,
  804. message_key,
  805. emitter.pubkey(),
  806. payer.pubkey(),
  807. sequence,
  808. )
  809. .is_err());
  810. }
  811. fn test_foreign_bridge_messages(context: &mut Context) {
  812. // Initialize a wormhole bridge on Solana to test with.
  813. let (ref payer, ref client, ref program) = common::setup();
  814. let nonce = rand::thread_rng().gen();
  815. let message = [0u8; 32].to_vec();
  816. let emitter = Keypair::new();
  817. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  818. // Verify the VAA generated on a foreign chain.
  819. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 2);
  820. // Derive where we expect created accounts to be.
  821. let message_key = PostedVAA::<'_, { AccountState::MaybeInitialized }>::key(
  822. &PostedVAADerivationData {
  823. payload_hash: hash_vaa(&vaa).to_vec(),
  824. },
  825. &program,
  826. );
  827. let signature_set =
  828. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  829. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  830. common::sync(client, payer);
  831. // Fetch chain accounts to verify state.
  832. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  833. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  834. assert_eq!(posted_message.0.vaa_version, 0);
  835. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  836. assert_eq!(posted_message.0.nonce, nonce);
  837. assert_eq!(posted_message.0.sequence, sequence);
  838. assert_eq!(posted_message.0.emitter_chain, 2);
  839. assert_eq!(posted_message.0.payload, message);
  840. assert_eq!(
  841. posted_message.0.emitter_address,
  842. emitter.pubkey().to_bytes()
  843. );
  844. // Verify on chain Signatures
  845. assert_eq!(signatures.hash, body);
  846. assert_eq!(signatures.guardian_set_index, 0);
  847. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  848. assert_eq!(*signature, true);
  849. }
  850. }
  851. fn test_transfer_total_fails(context: &mut Context) {
  852. // Initialize a wormhole bridge on Solana to test with.
  853. let (ref payer, ref client, ref program) = common::setup();
  854. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  855. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  856. // Be sure any previous tests have fully committed.
  857. common::sync(client, payer);
  858. let fee_collector = FeeCollector::key(None, &program);
  859. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  860. // Prepare to remove total balance, adding 10_000 to include the fee we're about to pay.
  861. let recipient = Keypair::new();
  862. let nonce = rand::thread_rng().gen();
  863. let message = GovernancePayloadTransferFees {
  864. amount: (account_balance + 10_000).into(),
  865. to: payer.pubkey().to_bytes(),
  866. }
  867. .try_to_vec()
  868. .unwrap();
  869. let message_key = common::post_message(
  870. client,
  871. program,
  872. payer,
  873. &emitter,
  874. nonce,
  875. message.clone(),
  876. 10_000,
  877. )
  878. .unwrap();
  879. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  880. let signature_set =
  881. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  882. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  883. // Transferring total fees should fail, to prevent the account being de-allocated.
  884. assert!(common::transfer_fees(
  885. client,
  886. program,
  887. payer,
  888. message_key,
  889. emitter.pubkey(),
  890. payer.pubkey(),
  891. sequence,
  892. )
  893. .is_err());
  894. common::sync(client, payer);
  895. // The fee should have been paid, but other than that the balance should be exactly the same,
  896. // I.E non-zero.
  897. assert_eq!(
  898. client.get_account(&fee_collector).unwrap().lamports,
  899. account_balance + 10_000
  900. );
  901. }
  902. fn test_upgrade_contract(context: &mut Context) {
  903. // Initialize a wormhole bridge on Solana to test with.
  904. let (ref payer, ref client, ref program) = common::setup();
  905. // Upgrade the guardian set with a new set of guardians.
  906. let (new_public_keys, new_secret_keys) = common::generate_keys(1);
  907. // New Contract Address
  908. let new_contract = Pubkey::new_unique();
  909. let nonce = rand::thread_rng().gen();
  910. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  911. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  912. let message = GovernancePayloadUpgrade {
  913. new_contract: new_contract.clone(),
  914. }
  915. .try_to_vec()
  916. .unwrap();
  917. let message_key = common::post_message(
  918. client,
  919. program,
  920. payer,
  921. &emitter,
  922. nonce,
  923. message.clone(),
  924. 10_000,
  925. )
  926. .unwrap();
  927. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  928. let signature_set =
  929. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  930. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  931. common::upgrade_contract(
  932. client,
  933. program,
  934. payer,
  935. message_key,
  936. emitter.pubkey(),
  937. new_contract,
  938. Pubkey::new_unique(),
  939. sequence,
  940. )
  941. .unwrap();
  942. common::sync(client, payer);
  943. }