Browse Source

Add transfer_tokens() to replace copypasted code

Mike MacCana 1 year ago
parent
commit
3de4c555b5

+ 1 - 0
tokens/escrow/anchor/README.md

@@ -25,6 +25,7 @@ This project is based on [Dean Little's Anchor Escrow,](https://github.com/deanm
 One of the challenges when teaching is avoiding ambiguity — names have to be carefully chosen to be clear and not possible to confuse with other times.
 
 - Custom instructions were replaced by `@solana-developers/helpers` for many tasks to reduce the file size.
+- Shared functionality to transfer tokens is now in `instructions/shared.rs`
 - The upstream project has a custom file layout. We use the 'multiple files' Anchor layout.
 - Contexts are separate data structures from functions that use the contexts. There is no need for OO-like `impl` patterns here - there's no mutable state stored in the Context, and the 'methods' do not mutate that state. Besides, it's easier to type!
 - The name 'deposit' was being used in multiple contexts, and `deposit` can be tough because it's a verb and a noun:

+ 10 - 17
tokens/escrow/anchor/programs/escrow/src/instructions/make_offer.rs

@@ -2,11 +2,13 @@ use anchor_lang::prelude::*;
 
 use anchor_spl::{
     associated_token::AssociatedToken,
-    token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked},
+    token_interface::{Mint, TokenAccount, TokenInterface},
 };
 
 use crate::{Offer, ANCHOR_DISCRIMINATOR};
 
+use super::transfer_tokens;
+
 // See https://www.anchor-lang.com/docs/account-constraints#instruction-attribute
 #[derive(Accounts)]
 #[instruction(id: u64)]
@@ -56,22 +58,13 @@ pub fn send_offered_tokens_to_vault(
     context: &Context<MakeOffer>,
     token_a_offered_amount: u64,
 ) -> Result<()> {
-    let transfer_accounts = TransferChecked {
-        from: context.accounts.maker_token_account_a.to_account_info(),
-        mint: context.accounts.token_mint_a.to_account_info(),
-        to: context.accounts.vault.to_account_info(),
-        authority: context.accounts.maker.to_account_info(),
-    };
-
-    let cpi_context = CpiContext::new(
-        context.accounts.token_program.to_account_info(),
-        transfer_accounts,
-    );
-
-    transfer_checked(
-        cpi_context,
-        token_a_offered_amount,
-        context.accounts.token_mint_a.decimals,
+    transfer_tokens(
+        &context.accounts.maker_token_account_a,
+        &context.accounts.vault,
+        &token_a_offered_amount,
+        &context.accounts.token_mint_a,
+        &context.accounts.maker,
+        &context.accounts.token_program,
     )
 }
 

+ 3 - 0
tokens/escrow/anchor/programs/escrow/src/instructions/mod.rs

@@ -3,3 +3,6 @@ pub use make_offer::*;
 
 pub mod take_offer;
 pub use take_offer::*;
+
+pub mod shared;
+pub use shared::*;

+ 25 - 0
tokens/escrow/anchor/programs/escrow/src/instructions/shared.rs

@@ -0,0 +1,25 @@
+use anchor_lang::prelude::*;
+
+use anchor_spl::token_interface::{
+    transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked,
+};
+
+pub fn transfer_tokens<'info>(
+    from: &InterfaceAccount<'info, TokenAccount>,
+    to: &InterfaceAccount<'info, TokenAccount>,
+    amount: &u64,
+    mint: &InterfaceAccount<'info, Mint>,
+    authority: &Signer<'info>,
+    token_program: &Interface<'info, TokenInterface>,
+) -> Result<()> {
+    let transfer_accounts = TransferChecked {
+        from: from.to_account_info(),
+        mint: mint.to_account_info(),
+        to: to.to_account_info(),
+        authority: authority.to_account_info(),
+    };
+
+    let cpi_context = CpiContext::new(token_program.to_account_info(), transfer_accounts);
+
+    transfer_checked(cpi_context, *amount, mint.decimals)
+}

+ 9 - 16
tokens/escrow/anchor/programs/escrow/src/instructions/take_offer.rs

@@ -10,6 +10,8 @@ use anchor_spl::{
 
 use crate::Offer;
 
+use super::transfer_tokens;
+
 #[derive(Accounts)]
 pub struct TakeOffer<'info> {
     #[account(mut)]
@@ -73,22 +75,13 @@ pub struct TakeOffer<'info> {
 }
 
 pub fn send_wanted_tokens_to_maker(ctx: &Context<TakeOffer>) -> Result<()> {
-    let transfer_accounts = TransferChecked {
-        from: ctx.accounts.taker_token_account_b.to_account_info(),
-        mint: ctx.accounts.token_mint_b.to_account_info(),
-        to: ctx.accounts.maker_token_account_b.to_account_info(),
-        authority: ctx.accounts.taker.to_account_info(),
-    };
-
-    let cpi_ctx = CpiContext::new(
-        ctx.accounts.token_program.to_account_info(),
-        transfer_accounts,
-    );
-
-    transfer_checked(
-        cpi_ctx,
-        ctx.accounts.offer.token_b_wanted_amount,
-        ctx.accounts.token_mint_b.decimals,
+    transfer_tokens(
+        &ctx.accounts.taker_token_account_b,
+        &ctx.accounts.maker_token_account_b,
+        &ctx.accounts.offer.token_b_wanted_amount,
+        &ctx.accounts.token_mint_b,
+        &ctx.accounts.taker,
+        &ctx.accounts.token_program,
     )
 }