integration.rs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140
  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. FeeCollector,
  59. GuardianSet,
  60. GuardianSetDerivationData,
  61. PostedVAA,
  62. PostedVAADerivationData,
  63. SignatureSet,
  64. },
  65. instruction,
  66. instructions::hash_vaa,
  67. types::{
  68. BridgeConfig,
  69. BridgeData,
  70. ConsistencyLevel,
  71. GovernancePayloadGuardianSetChange,
  72. GovernancePayloadSetMessageFee,
  73. GovernancePayloadTransferFees,
  74. GovernancePayloadUpgrade,
  75. GuardianSetData,
  76. MessageData,
  77. PostedVAAData,
  78. SequenceTracker,
  79. SignatureSet as SignatureSetData,
  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. // Sign message locally.
  217. let (local_sig, recover_id) =
  218. secp256k1::sign(&Secp256k1Message::parse(&body_hash), &secret_key);
  219. // Combine recoverify with signature to match 65 byte layout.
  220. let mut signature_bytes = [0u8; 65];
  221. signature_bytes[64] = recover_id.serialize();
  222. (&mut signature_bytes[0..64]).copy_from_slice(&local_sig.serialize());
  223. // Signature stored should on chain be as expected.
  224. assert_eq!(*signature, signature_bytes);
  225. }
  226. }
  227. // Prepare another message with no data in its message to confirm it succeeds.
  228. let nonce = rand::thread_rng().gen();
  229. let message = b"".to_vec();
  230. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  231. // Post the message, publishing the data for guardian consumption.
  232. let message_key = common::post_message(
  233. client,
  234. program,
  235. payer,
  236. &emitter,
  237. nonce,
  238. message.clone(),
  239. 10_000,
  240. )
  241. .unwrap();
  242. // Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
  243. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  244. let signature_set =
  245. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  246. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  247. common::sync(client, payer);
  248. // Fetch chain accounts to verify state.
  249. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  250. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  251. // Verify on chain Message
  252. assert_eq!(posted_message.0.vaa_version, 0);
  253. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  254. assert_eq!(posted_message.0.nonce, nonce);
  255. assert_eq!(posted_message.0.sequence, sequence);
  256. assert_eq!(posted_message.0.emitter_chain, 1);
  257. assert_eq!(posted_message.0.payload, message);
  258. assert_eq!(
  259. posted_message.0.emitter_address,
  260. emitter.pubkey().to_bytes()
  261. );
  262. // Verify on chain Signatures
  263. assert_eq!(signatures.hash, body);
  264. assert_eq!(signatures.guardian_set_index, 0);
  265. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  266. // Sign message locally.
  267. let (local_sig, recover_id) =
  268. secp256k1::sign(&Secp256k1Message::parse(&body_hash), &secret_key);
  269. // Combine recoverify with signature to match 65 byte layout.
  270. let mut signature_bytes = [0u8; 65];
  271. signature_bytes[64] = recover_id.serialize();
  272. (&mut signature_bytes[0..64]).copy_from_slice(&local_sig.serialize());
  273. // Signature stored should on chain be as expected.
  274. assert_eq!(*signature, signature_bytes);
  275. }
  276. }
  277. fn test_invalid_emitter(context: &mut Context) {
  278. let (ref payer, ref client, ref program) = common::setup();
  279. // Generate a message we want to persist.
  280. let message = [0u8; 32].to_vec();
  281. let emitter = Keypair::new();
  282. let nonce = rand::thread_rng().gen();
  283. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  284. let fee_collector = FeeCollector::key(None, &program);
  285. let msg_account = Keypair::new();
  286. // Manually send a message that isn't signed by the emitter, which should be rejected to
  287. // prevent fraudulant transactions sent on behalf of an emitter.
  288. let mut instruction = bridge::instructions::post_message(
  289. *program,
  290. payer.pubkey(),
  291. emitter.pubkey(),
  292. msg_account.pubkey(),
  293. nonce,
  294. message,
  295. ConsistencyLevel::Confirmed,
  296. )
  297. .unwrap();
  298. // Modify account list to not require the emitter signs.
  299. instruction.accounts[2].is_signer = false;
  300. // Executing this should fail.
  301. assert!(common::execute(
  302. client,
  303. payer,
  304. &[payer],
  305. &[
  306. system_instruction::transfer(&payer.pubkey(), &fee_collector, 10_000),
  307. instruction,
  308. ],
  309. solana_sdk::commitment_config::CommitmentConfig::processed(),
  310. )
  311. .is_err());
  312. }
  313. fn test_duplicate_messages_fail(context: &mut Context) {
  314. let (ref payer, ref client, ref program) = common::setup();
  315. // We'll use the following nonce/message/emitter/sequence twice.
  316. let nonce = rand::thread_rng().gen();
  317. let message = [0u8; 32].to_vec();
  318. let emitter = Keypair::new();
  319. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  320. // Post the message, publishing the data for guardian consumption.
  321. let message_key = common::post_message(
  322. client,
  323. program,
  324. payer,
  325. &emitter,
  326. nonce,
  327. message.clone(),
  328. 10_000,
  329. )
  330. .unwrap();
  331. // Second should fail due to duplicate derivations.
  332. assert!(common::post_message(
  333. client,
  334. program,
  335. payer,
  336. &emitter,
  337. nonce,
  338. message.clone(),
  339. 10_000,
  340. )
  341. .is_err());
  342. }
  343. fn test_guardian_set_change(context: &mut Context) {
  344. // Initialize a wormhole bridge on Solana to test with.
  345. let (ref payer, ref client, ref program) = common::setup();
  346. // Use a timestamp from a few seconds earlier for testing to simulate thread::sleep();
  347. let now = std::time::SystemTime::now()
  348. .duration_since(std::time::UNIX_EPOCH)
  349. .unwrap()
  350. .as_secs()
  351. - 10;
  352. // Upgrade the guardian set with a new set of guardians.
  353. let (new_public_keys, new_secret_keys) = common::generate_keys(1);
  354. let nonce = rand::thread_rng().gen();
  355. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  356. println!("{}", emitter.pubkey().to_string());
  357. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  358. let message = GovernancePayloadGuardianSetChange {
  359. new_guardian_set_index: 1,
  360. new_guardian_set: new_public_keys.clone(),
  361. }
  362. .try_to_vec()
  363. .unwrap();
  364. let message_key = common::post_message(
  365. client,
  366. program,
  367. payer,
  368. &emitter,
  369. nonce,
  370. message.clone(),
  371. 10_000,
  372. )
  373. .unwrap();
  374. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  375. let signature_set =
  376. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  377. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  378. common::upgrade_guardian_set(
  379. client,
  380. program,
  381. payer,
  382. message_key,
  383. emitter.pubkey(),
  384. 0,
  385. 1,
  386. sequence,
  387. )
  388. .unwrap();
  389. common::sync(client, payer);
  390. // Derive keys for accounts we want to check.
  391. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  392. let guardian_set_key = GuardianSet::<'_, { AccountState::Uninitialized }>::key(
  393. &GuardianSetDerivationData { index: 1 },
  394. &program,
  395. );
  396. // Fetch account states.
  397. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  398. let guardian_set: GuardianSetData = common::get_account_data(client, &guardian_set_key);
  399. // Confirm the bridge now has a new guardian set, and no other fields have shifted.
  400. assert_eq!(bridge.guardian_set_index, 1);
  401. assert_eq!(bridge.config.guardian_set_expiration_time, 2_000_000_000);
  402. assert_eq!(bridge.config.fee, 500);
  403. // Verify Created Guardian Set
  404. assert_eq!(guardian_set.index, 1);
  405. assert_eq!(guardian_set.keys, new_public_keys);
  406. assert!(guardian_set.creation_time as u64 > now);
  407. // Submit the message a second time with a new nonce.
  408. let nonce = rand::thread_rng().gen();
  409. let message_key = common::post_message(
  410. client,
  411. program,
  412. payer,
  413. &emitter,
  414. nonce,
  415. message.clone(),
  416. 10_000,
  417. )
  418. .unwrap();
  419. context.public = new_public_keys;
  420. context.secret = new_secret_keys;
  421. // Emulate Guardian behaviour, verifying the data and publishing signatures/VAA.
  422. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  423. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  424. let signature_set =
  425. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  426. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  427. common::sync(client, payer);
  428. // Fetch chain accounts to verify state.
  429. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  430. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  431. // Verify on chain Message
  432. assert_eq!(posted_message.0.vaa_version, 0);
  433. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  434. assert_eq!(posted_message.0.nonce, nonce);
  435. assert_eq!(posted_message.0.sequence, sequence);
  436. assert_eq!(posted_message.0.emitter_chain, 1);
  437. assert_eq!(posted_message.0.payload, message);
  438. assert_eq!(
  439. posted_message.0.emitter_address,
  440. emitter.pubkey().to_bytes()
  441. );
  442. // Verify on chain Signatures
  443. assert_eq!(signatures.hash, body);
  444. assert_eq!(signatures.guardian_set_index, 1);
  445. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  446. // Sign message locally.
  447. let (local_sig, recover_id) =
  448. secp256k1::sign(&Secp256k1Message::parse(&body_hash), &secret_key);
  449. // Combine recoverify with signature to match 65 byte layout.
  450. let mut signature_bytes = [0u8; 65];
  451. signature_bytes[64] = recover_id.serialize();
  452. (&mut signature_bytes[0..64]).copy_from_slice(&local_sig.serialize());
  453. // Signature stored should on chain be as expected.
  454. assert_eq!(*signature, signature_bytes);
  455. }
  456. }
  457. fn test_guardian_set_change_fails(context: &mut Context) {
  458. // Initialize a wormhole bridge on Solana to test with.
  459. let (ref payer, ref client, ref program) = common::setup();
  460. // Use a random emitter key to confirm the bridge rejects transactions from non-governance key.
  461. let emitter = Keypair::new();
  462. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  463. // Upgrade the guardian set with a new set of guardians.
  464. let (new_public_keys, new_secret_keys) = common::generate_keys(6);
  465. let nonce = rand::thread_rng().gen();
  466. let message = GovernancePayloadGuardianSetChange {
  467. new_guardian_set_index: 2,
  468. new_guardian_set: new_public_keys.clone(),
  469. }
  470. .try_to_vec()
  471. .unwrap();
  472. let message_key = common::post_message(
  473. client,
  474. program,
  475. payer,
  476. &emitter,
  477. nonce,
  478. message.clone(),
  479. 10_000,
  480. )
  481. .unwrap();
  482. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  483. assert!(common::upgrade_guardian_set(
  484. client,
  485. program,
  486. payer,
  487. message_key,
  488. emitter.pubkey(),
  489. 1,
  490. 2,
  491. sequence,
  492. )
  493. .is_err());
  494. }
  495. fn test_set_fees(context: &mut Context) {
  496. // Initialize a wormhole bridge on Solana to test with.
  497. let (ref payer, ref client, ref program) = common::setup();
  498. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  499. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  500. let nonce = rand::thread_rng().gen();
  501. let message = GovernancePayloadSetMessageFee {
  502. fee: U256::from(100),
  503. }
  504. .try_to_vec()
  505. .unwrap();
  506. let message_key = common::post_message(
  507. client,
  508. program,
  509. payer,
  510. &emitter,
  511. nonce,
  512. message.clone(),
  513. 10_000,
  514. )
  515. .unwrap();
  516. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  517. let signature_set =
  518. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  519. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  520. common::set_fees(
  521. client,
  522. program,
  523. payer,
  524. message_key,
  525. emitter.pubkey(),
  526. sequence,
  527. )
  528. .unwrap();
  529. common::sync(client, payer);
  530. // Fetch Bridge to check on-state value.
  531. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  532. let fee_collector = FeeCollector::key(None, &program);
  533. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  534. assert_eq!(bridge.config.fee, 100);
  535. // Check that posting a new message fails with too small a fee.
  536. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  537. let emitter = Keypair::new();
  538. let nonce = rand::thread_rng().gen();
  539. let message = [0u8; 32].to_vec();
  540. assert!(
  541. common::post_message(client, program, payer, &emitter, nonce, message.clone(), 50).is_err()
  542. );
  543. common::sync(client, payer);
  544. assert_eq!(
  545. client.get_account(&fee_collector).unwrap().lamports,
  546. account_balance,
  547. );
  548. // And succeeds with the new.
  549. let emitter = Keypair::new();
  550. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  551. let nonce = rand::thread_rng().gen();
  552. let message = [0u8; 32].to_vec();
  553. let message_key = common::post_message(
  554. client,
  555. program,
  556. payer,
  557. &emitter,
  558. nonce,
  559. message.clone(),
  560. 100,
  561. )
  562. .unwrap();
  563. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  564. let signature_set =
  565. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  566. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  567. common::sync(client, payer);
  568. // Verify that the fee collector was paid.
  569. assert_eq!(
  570. client.get_account(&fee_collector).unwrap().lamports,
  571. account_balance + 100,
  572. );
  573. // And that the new message is on chain.
  574. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  575. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  576. // Verify on chain Message
  577. assert_eq!(posted_message.0.vaa_version, 0);
  578. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  579. assert_eq!(posted_message.0.nonce, nonce);
  580. assert_eq!(posted_message.0.sequence, sequence);
  581. assert_eq!(posted_message.0.emitter_chain, 1);
  582. assert_eq!(posted_message.0.payload, message);
  583. assert_eq!(
  584. posted_message.0.emitter_address,
  585. emitter.pubkey().to_bytes()
  586. );
  587. // Verify on chain Signatures
  588. assert_eq!(signatures.hash, body);
  589. assert_eq!(signatures.guardian_set_index, 1);
  590. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  591. // Sign message locally.
  592. let (local_sig, recover_id) =
  593. secp256k1::sign(&Secp256k1Message::parse(&body_hash), &secret_key);
  594. // Combine recoverify with signature to match 65 byte layout.
  595. let mut signature_bytes = [0u8; 65];
  596. signature_bytes[64] = recover_id.serialize();
  597. (&mut signature_bytes[0..64]).copy_from_slice(&local_sig.serialize());
  598. // Signature stored should on chain be as expected.
  599. assert_eq!(*signature, signature_bytes);
  600. }
  601. }
  602. fn test_set_fees_fails(context: &mut Context) {
  603. // Initialize a wormhole bridge on Solana to test with.
  604. let (ref payer, ref client, ref program) = common::setup();
  605. // Use a random key to confirm only the governance key is respected.
  606. let emitter = Keypair::new();
  607. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  608. let nonce = rand::thread_rng().gen();
  609. let message = GovernancePayloadSetMessageFee {
  610. fee: U256::from(100),
  611. }
  612. .try_to_vec()
  613. .unwrap();
  614. let message_key = common::post_message(
  615. client,
  616. program,
  617. payer,
  618. &emitter,
  619. nonce,
  620. message.clone(),
  621. 10_000,
  622. )
  623. .unwrap();
  624. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  625. let signature_set =
  626. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  627. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  628. assert!(common::set_fees(
  629. client,
  630. program,
  631. payer,
  632. message_key,
  633. emitter.pubkey(),
  634. sequence,
  635. )
  636. .is_err());
  637. common::sync(client, payer);
  638. }
  639. fn test_free_fees(context: &mut Context) {
  640. // Initialize a wormhole bridge on Solana to test with.
  641. let (ref payer, ref client, ref program) = common::setup();
  642. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  643. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  644. // Set Fees to 0.
  645. let nonce = rand::thread_rng().gen();
  646. let message = GovernancePayloadSetMessageFee { fee: U256::from(0) }
  647. .try_to_vec()
  648. .unwrap();
  649. let message_key = common::post_message(
  650. client,
  651. program,
  652. payer,
  653. &emitter,
  654. nonce,
  655. message.clone(),
  656. 10_000,
  657. )
  658. .unwrap();
  659. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  660. let signature_set =
  661. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  662. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  663. common::set_fees(
  664. client,
  665. program,
  666. payer,
  667. message_key,
  668. emitter.pubkey(),
  669. sequence,
  670. )
  671. .unwrap();
  672. common::sync(client, payer);
  673. // Fetch Bridge to check on-state value.
  674. let bridge_key = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &program);
  675. let fee_collector = FeeCollector::key(None, &program);
  676. let bridge: BridgeData = common::get_account_data(client, &bridge_key);
  677. assert_eq!(bridge.config.fee, 0);
  678. // Check that posting a new message is free.
  679. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  680. let emitter = Keypair::new();
  681. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  682. let nonce = rand::thread_rng().gen();
  683. let message = [0u8; 32].to_vec();
  684. let message_key =
  685. common::post_message(client, program, payer, &emitter, nonce, message.clone(), 0).unwrap();
  686. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  687. let signature_set =
  688. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  689. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  690. common::sync(client, payer);
  691. // Verify that the fee collector was paid.
  692. assert_eq!(
  693. client.get_account(&fee_collector).unwrap().lamports,
  694. account_balance,
  695. );
  696. // And that the new message is on chain.
  697. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  698. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  699. // Verify on chain Message
  700. assert_eq!(posted_message.0.vaa_version, 0);
  701. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  702. assert_eq!(posted_message.0.nonce, nonce);
  703. assert_eq!(posted_message.0.sequence, sequence);
  704. assert_eq!(posted_message.0.emitter_chain, 1);
  705. assert_eq!(posted_message.0.payload, message);
  706. assert_eq!(
  707. posted_message.0.emitter_address,
  708. emitter.pubkey().to_bytes()
  709. );
  710. // Verify on chain Signatures
  711. assert_eq!(signatures.hash, body);
  712. assert_eq!(signatures.guardian_set_index, 1);
  713. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  714. // Sign message locally.
  715. let (local_sig, recover_id) =
  716. secp256k1::sign(&Secp256k1Message::parse(&body_hash), &secret_key);
  717. // Combine recoverify with signature to match 65 byte layout.
  718. let mut signature_bytes = [0u8; 65];
  719. signature_bytes[64] = recover_id.serialize();
  720. (&mut signature_bytes[0..64]).copy_from_slice(&local_sig.serialize());
  721. // Signature stored should on chain be as expected.
  722. assert_eq!(*signature, signature_bytes);
  723. }
  724. }
  725. fn test_transfer_fees(context: &mut Context) {
  726. // Initialize a wormhole bridge on Solana to test with.
  727. let (ref payer, ref client, ref program) = common::setup();
  728. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  729. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  730. let recipient = Keypair::new();
  731. let nonce = rand::thread_rng().gen();
  732. let message = GovernancePayloadTransferFees {
  733. amount: 100.into(),
  734. to: payer.pubkey().to_bytes(),
  735. }
  736. .try_to_vec()
  737. .unwrap();
  738. // Fetch accounts for chain state checking.
  739. let fee_collector = FeeCollector::key(None, &program);
  740. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  741. let message_key = common::post_message(
  742. client,
  743. program,
  744. payer,
  745. &emitter,
  746. nonce,
  747. message.clone(),
  748. 10_000,
  749. )
  750. .unwrap();
  751. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  752. let signature_set =
  753. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  754. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  755. common::transfer_fees(
  756. client,
  757. program,
  758. payer,
  759. message_key,
  760. emitter.pubkey(),
  761. payer.pubkey(),
  762. sequence,
  763. )
  764. .unwrap();
  765. common::sync(client, payer);
  766. }
  767. fn test_transfer_fees_fails(context: &mut Context) {
  768. // Initialize a wormhole bridge on Solana to test with.
  769. let (ref payer, ref client, ref program) = common::setup();
  770. // Use an invalid emitter.
  771. let emitter = Keypair::new();
  772. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  773. let recipient = Keypair::new();
  774. let nonce = rand::thread_rng().gen();
  775. let message = GovernancePayloadTransferFees {
  776. amount: 100.into(),
  777. to: payer.pubkey().to_bytes(),
  778. }
  779. .try_to_vec()
  780. .unwrap();
  781. // Fetch accounts for chain state checking.
  782. let fee_collector = FeeCollector::key(None, &program);
  783. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  784. let message_key = common::post_message(
  785. client,
  786. program,
  787. payer,
  788. &emitter,
  789. nonce,
  790. message.clone(),
  791. 10_000,
  792. )
  793. .unwrap();
  794. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  795. let signature_set =
  796. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  797. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  798. assert!(common::transfer_fees(
  799. client,
  800. program,
  801. payer,
  802. message_key,
  803. emitter.pubkey(),
  804. payer.pubkey(),
  805. sequence,
  806. )
  807. .is_err());
  808. }
  809. fn test_transfer_too_much(context: &mut Context) {
  810. // Initialize a wormhole bridge on Solana to test with.
  811. let (ref payer, ref client, ref program) = common::setup();
  812. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  813. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  814. let recipient = Keypair::new();
  815. let nonce = rand::thread_rng().gen();
  816. let message = GovernancePayloadTransferFees {
  817. amount: 100_000_000_000u64.into(),
  818. to: payer.pubkey().to_bytes(),
  819. }
  820. .try_to_vec()
  821. .unwrap();
  822. // Fetch accounts for chain state checking.
  823. let fee_collector = FeeCollector::key(None, &program);
  824. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  825. let message_key = common::post_message(
  826. client,
  827. program,
  828. payer,
  829. &emitter,
  830. nonce,
  831. message.clone(),
  832. 10_000,
  833. )
  834. .unwrap();
  835. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 1, 1);
  836. let signature_set =
  837. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  838. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  839. // Should fail to transfer.
  840. assert!(common::transfer_fees(
  841. client,
  842. program,
  843. payer,
  844. message_key,
  845. emitter.pubkey(),
  846. payer.pubkey(),
  847. sequence,
  848. )
  849. .is_err());
  850. }
  851. fn test_foreign_bridge_messages(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 nonce = rand::thread_rng().gen();
  855. let message = [0u8; 32].to_vec();
  856. let emitter = Keypair::new();
  857. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  858. // Verify the VAA generated on a foreign chain.
  859. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 2);
  860. // Derive where we expect created accounts to be.
  861. let message_key = PostedVAA::<'_, { AccountState::MaybeInitialized }>::key(
  862. &PostedVAADerivationData {
  863. payload_hash: hash_vaa(&vaa).to_vec(),
  864. },
  865. &program,
  866. );
  867. let signature_set =
  868. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  869. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  870. common::sync(client, payer);
  871. // Fetch chain accounts to verify state.
  872. let posted_message: PostedVAAData = common::get_account_data(client, &message_key);
  873. let signatures: SignatureSetData = common::get_account_data(client, &signature_set);
  874. assert_eq!(posted_message.0.vaa_version, 0);
  875. assert_eq!(posted_message.0.vaa_signature_account, signature_set);
  876. assert_eq!(posted_message.0.nonce, nonce);
  877. assert_eq!(posted_message.0.sequence, sequence);
  878. assert_eq!(posted_message.0.emitter_chain, 2);
  879. assert_eq!(posted_message.0.payload, message);
  880. assert_eq!(
  881. posted_message.0.emitter_address,
  882. emitter.pubkey().to_bytes()
  883. );
  884. // Verify on chain Signatures
  885. assert_eq!(signatures.hash, body);
  886. assert_eq!(signatures.guardian_set_index, 0);
  887. for (signature, secret_key) in signatures.signatures.iter().zip(context.secret.iter()) {
  888. // Sign message locally.
  889. let (local_sig, recover_id) =
  890. secp256k1::sign(&Secp256k1Message::parse(&body_hash), &secret_key);
  891. // Combine recoverify with signature to match 65 byte layout.
  892. let mut signature_bytes = [0u8; 65];
  893. signature_bytes[64] = recover_id.serialize();
  894. (&mut signature_bytes[0..64]).copy_from_slice(&local_sig.serialize());
  895. // Signature stored should on chain be as expected.
  896. assert_eq!(*signature, signature_bytes);
  897. }
  898. }
  899. fn test_transfer_total_fails(context: &mut Context) {
  900. // Initialize a wormhole bridge on Solana to test with.
  901. let (ref payer, ref client, ref program) = common::setup();
  902. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  903. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  904. // Be sure any previous tests have fully committed.
  905. common::sync(client, payer);
  906. let fee_collector = FeeCollector::key(None, &program);
  907. let account_balance = client.get_account(&fee_collector).unwrap().lamports;
  908. // Prepare to remove total balance, adding 10_000 to include the fee we're about to pay.
  909. let recipient = Keypair::new();
  910. let nonce = rand::thread_rng().gen();
  911. let message = GovernancePayloadTransferFees {
  912. amount: (account_balance + 10_000).into(),
  913. to: payer.pubkey().to_bytes(),
  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, 1, 1);
  928. let signature_set =
  929. common::verify_signatures(client, program, payer, body, &context.secret, 1).unwrap();
  930. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  931. // Transferring total fees should fail, to prevent the account being de-allocated.
  932. assert!(common::transfer_fees(
  933. client,
  934. program,
  935. payer,
  936. message_key,
  937. emitter.pubkey(),
  938. payer.pubkey(),
  939. sequence,
  940. )
  941. .is_err());
  942. common::sync(client, payer);
  943. // The fee should have been paid, but other than that the balance should be exactly the same,
  944. // I.E non-zero.
  945. assert_eq!(
  946. client.get_account(&fee_collector).unwrap().lamports,
  947. account_balance + 10_000
  948. );
  949. }
  950. fn test_upgrade_contract(context: &mut Context) {
  951. // Initialize a wormhole bridge on Solana to test with.
  952. let (ref payer, ref client, ref program) = common::setup();
  953. // Upgrade the guardian set with a new set of guardians.
  954. let (new_public_keys, new_secret_keys) = common::generate_keys(1);
  955. // New Contract Address
  956. let new_contract = Pubkey::new_unique();
  957. let nonce = rand::thread_rng().gen();
  958. let emitter = Keypair::from_bytes(&GOVERNANCE_KEY).unwrap();
  959. let sequence = context.seq.next(emitter.pubkey().to_bytes());
  960. let message = GovernancePayloadUpgrade {
  961. new_contract: new_contract.clone(),
  962. }
  963. .try_to_vec()
  964. .unwrap();
  965. let message_key = common::post_message(
  966. client,
  967. program,
  968. payer,
  969. &emitter,
  970. nonce,
  971. message.clone(),
  972. 10_000,
  973. )
  974. .unwrap();
  975. let (vaa, body, body_hash) = common::generate_vaa(&emitter, message.clone(), nonce, 0, 1);
  976. let signature_set =
  977. common::verify_signatures(client, program, payer, body, &context.secret, 0).unwrap();
  978. common::post_vaa(client, program, payer, signature_set, vaa).unwrap();
  979. common::upgrade_contract(
  980. client,
  981. program,
  982. payer,
  983. message_key,
  984. emitter.pubkey(),
  985. new_contract,
  986. Pubkey::new_unique(),
  987. sequence,
  988. )
  989. .unwrap();
  990. common::sync(client, payer);
  991. }