make_offer.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use escrow_api::prelude::*;
  2. use steel::*;
  3. pub fn process_make_offer(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
  4. // Parse args.
  5. let args = MakeOffer::try_from_bytes(data)?;
  6. let id = u64::from_le_bytes(args.id);
  7. let token_a_offered_amount = u64::from_le_bytes(args.token_a_offered_amount);
  8. // Load accounts.
  9. let [maker_info, mint_a_info, mint_b_info, maker_token_account_a_info, offer_info, vault_info, token_program, system_program, associated_token_program] =
  10. accounts
  11. else {
  12. return Err(ProgramError::NotEnoughAccountKeys);
  13. };
  14. maker_info.is_signer()?;
  15. token_program.is_program(&spl_token::ID)?;
  16. system_program.is_program(&system_program::ID)?;
  17. associated_token_program.is_program(&ASSOCIATED_TOKEN_PROGRAM_ID)?;
  18. offer_info.is_empty()?.is_writable()?.has_seeds(
  19. &[
  20. OFFER_SEED,
  21. maker_info.key.as_ref(),
  22. id.to_le_bytes().as_ref(),
  23. ],
  24. &escrow_api::ID,
  25. )?;
  26. vault_info.is_empty()?.is_writable()?;
  27. // Create associated token account for vault
  28. create_associated_token_account(
  29. maker_info,
  30. offer_info,
  31. vault_info,
  32. mint_a_info,
  33. system_program,
  34. token_program,
  35. associated_token_program,
  36. )?;
  37. // Call CPI to create account offer
  38. create_account::<Offer>(
  39. offer_info,
  40. system_program,
  41. maker_info,
  42. &escrow_api::ID,
  43. &[
  44. OFFER_SEED,
  45. maker_info.key.as_ref(),
  46. id.to_le_bytes().as_ref(),
  47. ],
  48. )?;
  49. let _mint_a = mint_a_info.as_mint()?;
  50. let _mint_b = mint_b_info.as_mint()?;
  51. // transfer token A to vault
  52. transfer(
  53. maker_info,
  54. maker_token_account_a_info,
  55. vault_info,
  56. token_program,
  57. token_a_offered_amount,
  58. )?;
  59. let offer: &mut Offer = offer_info.as_account_mut::<Offer>(&escrow_api::ID)?;
  60. // Update state
  61. offer.id = args.id;
  62. offer.maker = *maker_info.key;
  63. offer.token_mint_a = *mint_a_info.key;
  64. offer.token_mint_b = *mint_b_info.key;
  65. offer.token_b_wanted_amount = args.token_b_wanted_amount;
  66. offer.bump = offer_pda(*maker_info.key, id).1;
  67. Ok(())
  68. }