The Token Program

On Solana everything token related is handled by the SPL Token Program and the Token2022 Program: Solana's native token framework that defines how all tokens are created, managed, and transferred.
It's a single, unified program that handles all token operations across the network, ensuring consistency and interoperability.
For anchor, everything token related can be found in the anchor-spl crate. For this reason, after having initialized an Anchor workspace we can just do:
cargo add anchor-splMint and Token Accounts
If you're familiar with Anchor, you'll know that they have a set of macros that help the user abstract away a lot of the complexities related to initializing accounts.
The same works here for Mint, Token and Associated Token accounts.
Mint Account
Thanks to the macros that Anchor offers, this is how we can easily create a Mint account:
#[derive(Accounts)]
pub struct CreateMint<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(
init,
payer = signer,
mint::decimals = 6,
mint::authority = signer.key(),
)]
pub mint: Account<'info, Mint>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
}Token Account
Same goes with the Token account. Creating a Token accounts through macros would look like this:
#[derive(Accounts)]
pub struct CreateToken<'info> {
#[account(mut)]
pub signer: Signer<'info>,
pub mint: Account<'info, Mint>,
#[account(
mut,
token::mint = mint,
token::authority = signer,
)]
pub token: Account<'info, TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
}Associated Token Account
Same goes for the Associated Token account, creating an Associated Token accounts through macros would look similar to creating a Token account, the only difference are the constraint and this is how it would look like:
#[derive(Accounts)]
pub struct CreateToken<'info> {
#[account(mut)]
pub signer: Signer<'info>,
pub mint: Account<'info, Mint>,
#[account(
mut,
associated_token::mint = mint,
associated_token::authority = signer,
)]
pub token: Account<'info, TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
}