lib.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. use anchor_lang::prelude::*;
  2. use anchor_spl::{
  3. associated_token::AssociatedToken,
  4. token::{
  5. mint_to, transfer as transfer_spl, Mint, MintTo, Token, TokenAccount,
  6. Transfer as TransferSPL,
  7. },
  8. };
  9. declare_id!("CSqtsYXnt2UfXttszwG6rGFFY7EedJ5kmn4xEyas4LeE");
  10. #[program]
  11. pub mod transfer_tokens_program {
  12. use super::*;
  13. pub fn create_token(
  14. _ctx: Context<CreateTokenContext>,
  15. _decimals: u8,
  16. _freeze_authority: Pubkey,
  17. ) -> Result<()> {
  18. // Note: Initialization for mint handled manually
  19. // As Poseidon's transpiler does not support initializeMint yet.
  20. Ok(())
  21. }
  22. pub fn mint(ctx: Context<MintContext>, amount: u64) -> Result<()> {
  23. let cpi_ctx = CpiContext::new(
  24. ctx.accounts.token_program.to_account_info(),
  25. MintTo {
  26. mint: ctx.accounts.mint_account.to_account_info(),
  27. to: ctx.accounts.associated_token_account.to_account_info(),
  28. authority: ctx.accounts.mint_authority.to_account_info(),
  29. },
  30. );
  31. mint_to(cpi_ctx, amount)?;
  32. Ok(())
  33. }
  34. pub fn transfer_tokens(ctx: Context<TransferTokensContext>, amount: u64) -> Result<()> {
  35. let cpi_accounts = TransferSPL {
  36. from: ctx.accounts.sender_token_account.to_account_info(),
  37. to: ctx.accounts.recipient_token_account.to_account_info(),
  38. authority: ctx.accounts.sender.to_account_info(),
  39. };
  40. let cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), cpi_accounts);
  41. transfer_spl(cpi_ctx, amount)?;
  42. Ok(())
  43. }
  44. }
  45. #[derive(Accounts)]
  46. #[instruction(decimals: u8)]
  47. pub struct CreateTokenContext<'info> {
  48. // Note: Poseidon's transpiler does not support initializeMint yet,
  49. // so this code is done manually using Anchor's InitializeMint.
  50. // init,
  51. // payer = mint_authority,
  52. // mint::decimals = decimals,
  53. // mint::authority = mint_authority.key(), this code is added manually
  54. #[account(
  55. init,
  56. payer = payer,
  57. mint::decimals = decimals,
  58. mint::authority = payer.key(),
  59. )]
  60. pub mint_account: Account<'info, Mint>,
  61. #[account(mut)]
  62. pub payer: Signer<'info>,
  63. // Token Program and System Program is added manually as Poseidon does not support it yet using initializeMint
  64. pub token_program: Program<'info, Token>,
  65. pub system_program: Program<'info, System>,
  66. }
  67. #[derive(Accounts)]
  68. pub struct MintContext<'info> {
  69. #[account(mut)]
  70. pub recipient: SystemAccount<'info>,
  71. #[account(
  72. init_if_needed,
  73. payer = mint_authority,
  74. associated_token::mint = mint_account,
  75. associated_token::authority = recipient,
  76. )]
  77. pub associated_token_account: Account<'info, TokenAccount>,
  78. #[account(mut)]
  79. pub mint_account: Account<'info, Mint>,
  80. #[account(mut)]
  81. pub mint_authority: Signer<'info>,
  82. pub associated_token_program: Program<'info, AssociatedToken>,
  83. pub token_program: Program<'info, Token>,
  84. pub system_program: Program<'info, System>,
  85. }
  86. #[derive(Accounts)]
  87. pub struct TransferTokensContext<'info> {
  88. #[account(mut)]
  89. pub sender: Signer<'info>,
  90. #[account(mut)]
  91. pub mint_account: Account<'info, Mint>,
  92. #[account(
  93. init_if_needed,
  94. payer = sender,
  95. associated_token::mint = mint_account,
  96. associated_token::authority = sender,
  97. )]
  98. pub sender_token_account: Account<'info, TokenAccount>,
  99. #[account(mut)]
  100. pub recipient: SystemAccount<'info>,
  101. #[account(
  102. init_if_needed,
  103. payer = sender,
  104. associated_token::mint = mint_account,
  105. associated_token::authority = recipient,
  106. )]
  107. pub recipient_token_account: Account<'info, TokenAccount>,
  108. pub associated_token_program: Program<'info, AssociatedToken>,
  109. pub token_program: Program<'info, Token>,
  110. pub system_program: Program<'info, System>,
  111. }