sync_native.rs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. mod setup;
  2. use {
  3. crate::setup::TOKEN_PROGRAM_ID,
  4. mollusk_svm::{result::Check, Mollusk},
  5. pinocchio_token_interface::{
  6. native_mint,
  7. state::{
  8. account::Account as TokenAccount, account_state::AccountState, load_mut_unchecked,
  9. },
  10. },
  11. solana_account::Account,
  12. solana_program_pack::Pack,
  13. solana_program_test::tokio,
  14. solana_pubkey::Pubkey,
  15. solana_rent::Rent,
  16. solana_sdk_ids::bpf_loader_upgradeable,
  17. };
  18. fn create_token_account(
  19. mint: &Pubkey,
  20. owner: &Pubkey,
  21. is_native: bool,
  22. amount: u64,
  23. program_owner: &Pubkey,
  24. ) -> Account {
  25. let space = size_of::<TokenAccount>();
  26. let mut lamports = Rent::default().minimum_balance(space);
  27. let mut data: Vec<u8> = vec![0u8; space];
  28. let token = unsafe { load_mut_unchecked::<TokenAccount>(data.as_mut_slice()).unwrap() };
  29. token.set_account_state(AccountState::Initialized);
  30. token.mint = *mint.as_array();
  31. token.owner = *owner.as_array();
  32. token.set_amount(amount);
  33. token.set_native(is_native);
  34. if is_native {
  35. token.set_native_amount(lamports);
  36. lamports = lamports.saturating_add(amount);
  37. }
  38. Account {
  39. lamports,
  40. data,
  41. owner: *program_owner,
  42. executable: false,
  43. ..Default::default()
  44. }
  45. }
  46. /// Creates a Mollusk instance with the default feature set, excluding the
  47. /// `bpf_account_data_direct_mapping` feature.
  48. fn mollusk() -> Mollusk {
  49. let mut mollusk = Mollusk::default();
  50. mollusk.add_program(
  51. &TOKEN_PROGRAM_ID,
  52. "pinocchio_token_program",
  53. &bpf_loader_upgradeable::id(),
  54. );
  55. mollusk
  56. }
  57. #[tokio::test]
  58. async fn sync_native() {
  59. let native_mint = Pubkey::new_from_array(native_mint::ID);
  60. let authority_key = Pubkey::new_unique();
  61. // native account
  62. // - amount: 1_000_000_000
  63. // - lamports: 2_000_000_000
  64. let source_account_key = Pubkey::new_unique();
  65. let mut source_account =
  66. create_token_account(&native_mint, &authority_key, true, 0, &TOKEN_PROGRAM_ID);
  67. source_account.lamports += 2_000_000_000;
  68. let instruction =
  69. spl_token_interface::instruction::sync_native(&TOKEN_PROGRAM_ID, &source_account_key)
  70. .unwrap();
  71. // Executes the sync_native instruction.
  72. let result = mollusk().process_and_validate_instruction_chain(
  73. &[(&instruction, &[Check::success()])],
  74. &[(source_account_key, source_account)],
  75. );
  76. result.resulting_accounts.iter().for_each(|(key, account)| {
  77. if *key == source_account_key {
  78. let token_account = spl_token_interface::state::Account::unpack(&account.data).unwrap();
  79. assert_eq!(token_account.amount, 2_000_000_000);
  80. }
  81. });
  82. }